- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
看代码:
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
}
正如在 Cannot overload function 中讨论的那样,第一个特化是合法的,甚至可以在 MSVC 中工作。 enum
的第二个特化甚至不想编译,说“错误 C2988:无法识别的模板声明/定义”。
在我看来,C++ 正在为方法创建相对不合逻辑的异常。枚举只是一个例子。同样的事情可以应用于成员类、typedef 等。
如果有人对此发表评论,我会很高兴。
最佳答案
这是 C++11 的一个非常晦涩的新特性。向 Microsoft 提交错误报告,尽管它不太可能被优先考虑,因为几乎没有人知道这是允许的。正确的语法是
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
};
我已经 filed a bug与海湾合作委员会。有人可以测试最近的 Clang 吗?
在 C++03 中,只有类和函数可以显式特化。从标准 C++03 14.7.3/1 开始:
An explicit specialization of any of the following:
- function template
- class template
- member function of a class template
- static data member of a class template
- member class of a class template
- member class template of a class or class template
- member function template of a class or class template
can be declared by a declaration introduced by
template<>
成员枚举不是这种情况。 (一般来说,一个 enum
类型在它的第一个声明中总是只定义一次。)
获取模板化的enum
或 typedef
,您可以将其包装在类模板中。在您的情况下,它将是 Foo
的成员类模板.这样的构造称为元函数。
C++11 也有别名模板,类似于模板化的 typedef,但它们不能显式特化。
只允许特殊类和函数的策略,然后允许此类模板封装其他东西,如 enum
和 typedef
,对我来说似乎比允许直接特化 enum
更一致.但是,也许语言正朝着您喜欢的方向发展。
关于c++ - 类模板的非类、非函数成员的显式特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11271553/
我是一名优秀的程序员,十分优秀!