假设:
template<typename T>
void f( T ) {
}
enum { // if changed to "enum E" it compiles
e
};
int main() {
f( e ); // line 10
}
我明白了:
foo.cpp: In function ‘int main()’:
foo.cpp:10: error: no matching function for call to ‘f(<anonymous enum>)’
然而,如果给enum
声明一个名字,它就会编译。为什么它不能用于匿名枚举?理想情况下,我希望将枚举值e
提升为int
并实例化f(int)
。
答案 0 :(得分:10)
未命名的类型根本不能用作模板参数
C ++ 03在14.3.1[temp.arg.type]/2
本地类型,没有链接的类型,未命名的类型或从这些类型中复合的类型不得用作模板类型参数的模板参数。
此限制在C ++ 0x中解除,并且您的程序在C ++ 0x模式下无法使用MSVC ++ 2010和gcc 4.5.2进行编译。
答案 1 :(得分:5)
理想情况下,我希望将枚举值e提升为int并实例化f(int)。
f(+e);
答案 2 :(得分:1)
您可以随时明确地进行宣传,以清楚地表明您的意图:
f(static_cast<int>(e));