在类模板中前向声明一个成员枚举

8

使用 C++11 的强类型 enum,可以像这样声明一个类的成员枚举:

class X {
public:
    enum class E;
};

enum class X::E { a, b };

然而,当将X变为类模板时:

template <typename T>
class X {
public:
    enum class E;
};

template <typename T>
enum class X<T>::E { a, b };

gcc 4.7.2和clang 3.0都会出现"error: ‘enum X::E’ is an enumeration template [-pedantic]"和"error: enumeration cannot be a template"错误。我认为相关的标准部分是§14 Templates,该部分的第一段如下所述:
在template-declaration中的声明应该:
- 声明或定义函数或类,或 - 定义类模板或嵌套在类模板内的类的静态数据成员,成员函数、成员类或成员枚举,或 - 定义类或类模板的成员模板,或 - 作为别名声明。
(强调是我的)。所以这是编译器问题吗,还是我完全误解了陈述?

gcc 4.8.1仍然认为这是一个错误,而clang 3.4则不认为是错误 - Constructor
使用gcc 4.8.2进行编译。 - evnu
@evnu 还包括 -pedantic-errors 编译器标志吗? - Constructor
@Constructor 我的错,我忘记了参数。不,它也会抛出一个警告。 - evnu
@构造函数:是的,这看起来很有前途。想把它发布为答案吗? - Taral
显示剩余2条评论
1个回答

3

我被要求创建这个答案。请查看C++标准的第14.5.1.4/1段中的[temp.mem.enum]段落:

An enumeration member of a class template may be defined outside the class template definition. [ Example:

template<class T> struct A {
  enum E : T;
};
A<int> a;
template<class T> enum A<T>::E : T { e1, e2 };
A<int>::E e = A<int>::e1;

—end example ]

最新版本的clang(3.4)使用-pedantic-errors标志编译您的代码是成功的,而gcc 4.8.1仍然认为这是一个错误。我认为这是gcc的一个bug。(点击查看) (点击查看)


好的,问题解决了。可能应该再往下读一点……感谢你的努力! - Taral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接