【问题标题】:Why enumeration cannot be a template?为什么枚举不能是模板?
【发布时间】:2014-03-21 18:55:39
【问题描述】:

enumeration cannot be a template 是我尝试使用BCC64(基于 Clang)编译以下代码时给出的错误:

template <typename T> enum class fooEnum : T
{
    a,b,c,d,e
};

起初,我认为这个明确的禁止是由于enum 底层类型限制,如果枚举底层类型可以模板化,那么它可能导致格式错误的枚举,但是当我们尝试这个时:

template <typename A> struct fooClass
{
    enum class fooEnum : A
    {
        a,b,c,d,e
    };
};

只要A 类型遵循与枚举基础类型相同的限制,它就可以毫无问题地编译,你知道,定义枚举值的表达式:

  • 应该是一个整数常量,足以容纳枚举的所有值
  • 每个枚举类型都应与charsigned/unsigned 整数类型兼容。

如果我们不遵守此规则,(使用类内或全局枚举)会出现另一个特定错误,正如预期的那样:

enum class fooEnum : fooClass
{
    a,b,c,d,e
};

非整数类型 'fooClass' 是无效的底层类型

所以,这就是为什么我想知道为什么即使已经对基础类型进行了控制,为什么也明确禁止创建模板枚举。标准中哪里提到了这个禁令?

感谢您的关注。

【问题讨论】:

  • C++11 中只有类和函数模板。 (C++14 将改变这一点)。作用域枚举不是类,尽管是用class 关键字声明的。
  • @n.m.我知道 C++14 的模板变量,我也知道强枚举不是类。但事实是,我不知道为什么强枚举不能模板化它们的底层类型,明确禁止背后的逻辑(或不合逻辑)原因是什么。
  • 没有充分的理由。标准是这样说的,仅此而已。

标签: c++ templates c++11 enum-class


【解决方案1】:

您可以通过在类中声明枚举(仅包含该枚举)来解决问题。

这里是代码

#include <iostream>
using namespace std;

template <typename T>
struct myEnum
{
    enum Values
    {
        a=0, b=1,c=2
    };
};

int main() {
    myEnum<int> abc;
    cout<<abc.Values::a<< abc.Values::b<<abc.Values::c;
    // your code goes here
    return 0;
}

输出:012

http://ideone.com/测试

【讨论】:

  • 您忘记将枚举设为枚举类;)
【解决方案2】:

根据定义 [C++ 标准 14.1],或超出定义,

模板定义了一个类或函数族或一个别名 类型家族。

枚举不是这些,所以它不能是模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2010-09-06
    相关资源
    最近更新 更多