引用枚举

时间:2015-11-20 20:42:48

标签: 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
}

然后,这些枚举在同一名称空间中的类MHAReplanParams的构造函数中使用,并在原始代码中的行73,74和75中使用。在C ++ 2003下编译时,我收到一条错误mha_planner::MetaSearchType::ROUND_ROBIN is not a valid class or namespace reference。然而,在C ++ 2011下编译并没有给出任何问题。我尝试查找两个版本之间的一些“代码破坏”差异,但我无法发现可能导致此问题的任何内容。

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

1 个答案:

答案 0 :(得分:1)

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

换句话说,在C ++ 11中允许使用mha_planner::MetaSearchType::ROUND_ROBIN,但在早期版本中,枚举值仅在封闭的命名空间范围内,因此您需要编写mha_planner::ROUND_ROBIN