使用枚举实例化模板

时间:2015-03-24 13:06:33

标签: c++ templates enums constants

为什么以下编译因error: ‘arg’ cannot appear in a constant-expression而失败?

class Foo {
public:
    enum myenum { BIRDY, NUMNUM };
    typedef enum myenum myenum_t;
    void bar(const myenum_t arg);
}
template<Foo::myenum_t> class MyClass {};
void Foo::bar(const myenum_t arg) {
    MyClass<arg> hey;
}

枚举类型是不是编译时常量吗?

2 个答案:

答案 0 :(得分:4)

你正在尝试使用变量,而不仅仅是常量,编译时没有变量,使用模板函数。

template<myenum_t>
void bar();

template<Foo::myenum_t arg>
void Foo::bar()
{
   MyClass<arg> hey;
}

答案 1 :(得分:2)

枚举值是编译时常量,但是您传递的是枚举类型的变量,在执行程序之前不会确定其值。