我有以下最小例子:
class A
{
template<typename X, typename Y>
void f()
{ }
template<>
void f<int, char>()
{ }
};
编译器提供错误消息
explicit specialzation in non-namespace scope.
为什么这是错的,我该如何解决?
答案 0 :(得分:1)
§14.7.3[temp.expl.spec] / p2:
应在包含专用模板的命名空间中声明显式特化。
所以你需要在A
的定义之外移动专门化:
class A
{
template<typename X, typename Y>
void f()
{ }
};
template<>
void A::f<int, char>()
{ }
答案 1 :(得分:0)
来自C ++标准:
应在其名称空间中声明显式特化 模板是成员,或者,对于成员模板,在命名空间中 其中封闭类或封闭类模板是其成员。 成员函数,成员类或的明确特化 类模板的静态数据成员应在声明中声明 类模板所属的名称空间。
因此,您需要将专业化移到A定义的范围之外。你可以试试这个:
class A
{
template<typename X, typename Y>
void f()
{ }
};
template<>
void A::f<int, char>()
{ }