我试图在我的程序中使范围枚举与基础类型相当,但以下代码不起作用。是因为我正在使用的编译器(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) 的引用:
对于每个函数模板,如果参数推导和检查成功,则模板参数(推导和/或显式)用于合成单个函数模板特化的声明,该特化添加到候选函数集以用于重载决议。如果 > 对于给定的函数模板,参数推导失败,则不会将此类函数添加到该模板的 >candidate 函数集中。
编辑。我的代码不符合 C++11(感谢 Vaughn Cato 和 Andy Prowl 的解释)。Andy Prowl 的回答中提供了替代工作代码。
PS 毕竟我最终使用命名空间制作了无范围的枚举:
namespace Test_ {
enum Test { A,B,C };
};
using Test_::Test;
namespace Test2_ {
enum Test2 { Z,Y,B };
};
using Test2_::Test2;