我知道,一般来说,我们可以在 C++11 中前向声明枚举。
那么,为什么会这样:
enum kind_t { kind1, kind2 };
template <kind_t Kind> struct foo {};
template <> struct foo<kind1> {
enum named : int;
};
enum foo<kind1>::named : int {
named1 = 123,
named2 = 456,
};
GCC(12.1)编译失败?错误是(Godbolt):
<source>:9:6: error: cannot add an enumerator list to a template instantiation
9 | enum foo<kind1>::named : int {
| ^~~~~~~~~~
ASM generation compiler returned: 1
<source>:9:6: error: cannot add an enumerator list to a template instantiation
9 | enum foo<kind1>::named : int {
| ^~~~~~~~~~
这似乎可以用 clang++ 14.0 编译良好...
当前代码中的前向声明枚举遇到错误,而 clang 和 msvc 似乎可以很好地处理它。
enum kind_t { kind1, kind2 };
template <kind_t Kind> struct foo {};
template <> struct foo<kind1> {
enum named : int;
};
enum foo<kind1>::named : int {
named1 = 123,
named2 = 456,
};
如果您想让代码与 GCC (12.1) 兼容,请尝试直接在类专业化内部定义枚举而不使用前向声明:
enum kind_t { kind1, kind2 };
template <kind_t Kind> struct foo {};
template <> struct foo<kind1> {
enum named : int {
named1 = 123,
named2 = 456,
};
};