c++ - 引用枚举时 C++ 2003 和 C++ 2011 之间代码不兼容的原因

标签 c++ c++11 c++03

我正在尝试将其作者使用 C++ 2011 编译的库(设置了 -std=c++0x 标志)合并到我自己使用 C++ 2003 编译的代码中。谢天谢地,该库不包含典型的 C++ 2011 关键字,如 auto。但是,当我尝试使用 C++ 2003 编译它时出现一个编译错误。

在这个头文件的第 42、49 和 55 行定义了三个枚举: https://github.com/venkatrn/improved-mha-planner/blob/master/sbpl/include/sbpl/planners/mha_planner.h .在以下代码段中,它们是 MetaSearchTypePlannerTypeMHAType:

namespace mha_planner
{
  enum MetaSearchType
  {
    ROUND_ROBIN,
    META_A_STAR,
    DTS
  };

  enum PlannerType
  {
    IMHA,
    SMHA
  };

  enum MHAType
  {
    ORIGINAL,
    PLUS,
    FOCAL,
    UNCONSTRAINED,
    GBFS
  };
}

class MHAReplanParams: public ReplanParams
{
  public:
    MHAReplanParams(double allocated_time): ReplanParams(allocated_time)
  {
    inflation_eps = 1.0;
    anchor_eps = 1.0;
    use_anchor = true;
    meta_search_type = mha_planner::MetaSearchType::ROUND_ROBIN;
    planner_type = mha_planner::PlannerType::SMHA;
    mha_type = mha_planner::MHAType::PLUS;
  };
    double inflation_eps, anchor_eps;
    bool use_anchor;
    mha_planner::MetaSearchType meta_search_type;
    mha_planner::PlannerType planner_type;
    mha_planner::MHAType mha_type;
}; 

//other classes
}

然后,这些枚举将在原始代码第 73、74 和 75 行中的同一命名空间和文件中的类 MHAReplanParams 的构造函数中使用。在 C++ 2003 下编译时,我收到一条错误消息,提示 mha_planner::MetaSearchType::ROUND_ROBIN 不是有效的类或命名空间引用。然而,在 C++ 2011 下编译不会出现任何问题。我尝试查找两个版本之间的一些“代码破坏”差异,但我找不到任何可能导致这种情况的东西。

注意:我尝试坚持使用 C++ 2003 的原因是我正在更广泛地使用其他更大的库,这些库是为 2003 设计的,而且我听说有时当您尝试使用时“会发生坏事”混合用于 C++ 2011 的代码和针对旧版本的代码。

最佳答案

我相信(但不是 100% 肯定)在 C++11 之前,您不能使用枚举类型本身的名称作为限定符。

换句话说,mha_planner::MetaSearchType::ROUND_ROBIN 在 C++11 中是允许的,但在早期版本中,枚举值只是在封闭的命名空间范围内,所以你可以这样写mha_planner::ROUND_ROBIN 代替。

关于c++ - 引用枚举时 C++ 2003 和 C++ 2011 之间代码不兼容的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33835735/

相关文章:

c++ - 将位图加载到窗口

c++ - 使用自动 : where can it be useful? 公开私有(private)类型

c++ - 将 vector 传递给某些需要某种大小的数组引用的遗留 API 的任何方法

c++ - 创建对象时是否初始化类中的成员值?

c++ - 无正则表达式的字符串格式验证(C++03)

c++ - 如何使用函数更改数组?

c++ - opengl中的深度测试

c++ - 改变setPosition时cocos2d-x中的粒子闪烁

c++ - 在 C++ 中,从函数返回 vector 仍然是不好的做法吗?

c++ - RVO 在返回前覆盖参数中的值