模板特化的枚举成员前向声明在GCC中编译失败
GCC与Clang对模板特化中枚举定义的处理差异分析
这段代码的核心矛盾在于GCC和Clang对C++标准中“类模板特化成员的外部枚举定义”规则的解读不一致。
问题本质
你在类模板特化foo<kind1>内部前向声明了枚举named,随后尝试在类外部定义该枚举并指定枚举值:
- Clang 14.0将特化后的
foo<kind1>视为普通的非模板结构体,认为这种操作符合C++11及以后允许枚举前向声明并后续定义的规则,因此编译通过。 - GCC 12.1则将
foo<kind1>认定为模板实例化的产物,认为给模板实例的成员枚举添加枚举器列表是不被允许的,因此抛出编译错误。
兼容解决方案
如果需要让代码在GCC下正常编译,只需将枚举的定义直接内嵌到模板特化的结构体内部即可:
enum kind_t { kind1, kind2 }; template <kind_t Kind> struct foo {}; template <> struct foo<kind1> { enum named : int { named1 = 123, named2 = 456, }; };
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

