引用枚举时 C++ 2003 和 C++ 2011 之间代码不兼容的原因
Reason for code incompatibility between C++ 2003 and C++ 2011 when referencing enums
我正在尝试将其作者使用 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。它们是以下代码段中的 MetaSearchType
、PlannerType
和 MHAType
:
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 行中的相同命名空间和文件中的 class MHAReplanParams
的构造函数中使用。在 C++ 2003 下编译时,出现 mha_planner::MetaSearchType::ROUND_ROBIN is not a valid class or namespace reference
错误。然而,在 C++ 2011 下编译不会出现任何问题。我尝试查找两个版本之间的一些 'code breaking' 差异,但我无法发现任何可能导致这种情况的原因。
注意:我尝试坚持使用 C++ 2003 的原因是我正在更广泛地使用其他更大的库,这些库是为 2003 设计的,而且我听说有时 "bad things happen" 当你尝试将针对 C++ 2011 的代码与针对旧版本的代码混合使用。
我相信(但不是 100% 肯定)在 C++11 之前,您不能使用枚举类型本身的名称作为限定符。
换句话说,mha_planner::MetaSearchType::ROUND_ROBIN
在 C++11 中是允许的,但在早期版本中,枚举值只是在封闭的命名空间范围内,所以你应该写成 mha_planner::ROUND_ROBIN
。
我正在尝试将其作者使用 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。它们是以下代码段中的 MetaSearchType
、PlannerType
和 MHAType
:
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 行中的相同命名空间和文件中的 class MHAReplanParams
的构造函数中使用。在 C++ 2003 下编译时,出现 mha_planner::MetaSearchType::ROUND_ROBIN is not a valid class or namespace reference
错误。然而,在 C++ 2011 下编译不会出现任何问题。我尝试查找两个版本之间的一些 'code breaking' 差异,但我无法发现任何可能导致这种情况的原因。
注意:我尝试坚持使用 C++ 2003 的原因是我正在更广泛地使用其他更大的库,这些库是为 2003 设计的,而且我听说有时 "bad things happen" 当你尝试将针对 C++ 2011 的代码与针对旧版本的代码混合使用。
我相信(但不是 100% 肯定)在 C++11 之前,您不能使用枚举类型本身的名称作为限定符。
换句话说,mha_planner::MetaSearchType::ROUND_ROBIN
在 C++11 中是允许的,但在早期版本中,枚举值只是在封闭的命名空间范围内,所以你应该写成 mha_planner::ROUND_ROBIN
。