gpt4 book ai didi

c++ - 模板结构中枚举类的动态初始化

转载 作者:太空狗 更新时间:2023-10-29 23:05:31 25 4
gpt4 key购买 nike

我正在用 clang 编译以下测试代码:

template<typename T> struct S1
{
struct S2{
enum class E1;
enum class E2: T;
enum class E3: short;
};

typename S2::E1 b1;
typename S2::E2 b2;
typename S2::E3 b3;

enum class S1::S2::E1 {e11,e12};
enum class S1::S2::E2 : T {e21,e22};
enum class S1::S2::E3 : short {e31,e32};
};

template struct S1<int>;

我收到错误:模板特化或定义需要与嵌套类型“S1< T >”相对应的模板参数列表。我的猜测是因为在

中添加成员时定义了 struct S1
enum class S1::S2::E1 {e11,e12} 
enum class S1::S2::E2 : T {e21,e22};
enum class S1::S2::E3 : short {e31,e32};

编译器不知道 T 是什么,因为 S1 尚未实例化,因此无法解析 T。因此,编译器不知道枚举成员的大小,因此会抛出错误。这样对吗?标准中有规定吗?

注意:gcc 不会抛出任何此类错误。

最佳答案

根本不允许定义enum像那样。 n3337 中的第 7.2/4 段指出:

If the enum-key is followed by a nested-name-specifier, the enum-specifier shall refer to an enumeration that was previously declared directly in the class or namespace to which the nested-name-specifier refers (i.e., neither inherited nor introduced by a using-declaration), and the enum-specifier shall appear in a namespace enclosing the previous declaration.

诚然,错误消息并不十分清楚。您的示例可以大大简化为:

template<typename T> struct S1
{
struct S2 {
enum class E;
};

enum class S2::E {};
};

这将产生相同的错误消息。

有效选项是:

// definition in the scope that the declaration appears in
template<typename T> struct S1
{
struct S2 {
enum class E;
enum class E {};
};
};

// definition in the enclosing namespace scope
template<typename T> struct S1
{
struct S2 {
enum class E;
};
};

template<typename T>
enum class S1<T>::S2::E {};

同样的规则也适用于嵌套类(参见 9.7/3)。如果你试试这个

template<typename T>
struct S1
{
struct S2 {
struct S3;
};

struct S2::S3 {};
};

然后 GCC 也会产生一个(同样无用的)错误。它对枚举的作用不同,这似乎是一个错误。

您自己对错误的解释是不正确的。在模板的定义中,编译器不需要(显然不能)知道什么 T是。它只在实例化模板时需要它。不然怎么会像 template<typename T> struct X { T obj; };工作?

关于c++ - 模板结构中枚举类的动态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19028191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com