【问题标题】:Instantiate template using enum使用枚举实例化模板
【发布时间】:2023-10-20 12:22:01
【问题描述】:

为什么下面的编译会以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;
}

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

【问题讨论】:

  • arg 是运行时值。模板参数必须是 compile-time 构造。

标签: c++ templates enums constants


【解决方案1】:

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

template<myenum_t>
void bar();

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

【讨论】:

    【解决方案2】:

    枚举值是编译时常量,但您传递的是枚举类型的变量,该变量的值直到程序执行后才确定。

    【讨论】:

      最近更新 更多