【发布时间】:2013-03-17 11:37:55
【问题描述】:
我正在尝试使我的程序中的范围枚举与基础类型相当,但以下代码不起作用。是因为我正在使用的编译器(VC11)对 C++11 标准的支持很差,还是因为代码违反了 C++11 标准的一些规则?在后一种情况下,究竟违反了哪些规则(欢迎引用特定的标准条款)?
#include <type_traits>
enum class Test: short int { A,B,C };
template<typename E> bool operator != (E e, typename std::underlying_type<E>::type n)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}
template<typename E> bool operator != (typename std::underlying_type<E>::type n, E e)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}
int main()
{
short int x = 123;
x != Test::B; // compilation error
}
这就是我认为我的代码应该符合 C++11 的原因。引用 C++11 标准 (14.8.3.1):
对于每个函数模板,如果参数推导和检查成功,则模板参数 (推导和/或显式)用于合成单个函数模板的声明 添加到要在重载决议中使用的候选函数集的特化。如果,>对于给定的函数模板,参数推导失败,则不会将此类函数添加到>该模板的候选函数集合中。
编辑。我的代码不符合 C++11(感谢 Vaughn Cato 和 Andy Prowl 的解释)。 Andy Prowl 的回答中提供了替代工作代码。
附:毕竟我最终使用命名空间制作了无范围的枚举:
namespace Test_ {
enum Test { A,B,C };
};
using Test_::Test;
namespace Test2_ {
enum Test2 { Z,Y,B };
};
using Test2_::Test2;
【问题讨论】:
标签: c++ templates c++11 enums sfinae