看代码:
template <class x> struct Foo
{
int getX(x *p) { return(0); }
enum E12 { a };
};
template <> int Foo<int>::getX(int*)
{
return(-15);
}
template <> enum Foo<int>::E12
{
a, b, c
}
正如在不能重载函数中讨论的那样,第一个特化是合法的,甚至在 MSVC 中也有效。而第二个专业化 forenum
甚至不想编译,说“错误 C2988:无法识别的模板声明/定义”。
在我看来,C++ 正在为方法制造相对不合逻辑的例外。枚举只是一个例子。同样的事情可以应用于成员类、类型定义等。
我会很高兴有人对此发表评论。