这是一些无法编译的代码。
namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}
template <typename T>
int ns :: foo :: bar (T*) // this is OK
{
return 0;
}
template <>
int ns :: foo :: bar <int> (int *) // this is an error
{
return 1;
}
错误是:“模板 int ns::foo::bar(T*) 定义中的不同命名空间 [-fpermissive] 中的 'template int ns::foo::bar(T*)' 的特化”
这是一个可以编译的版本:
namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}
template <typename T>
int ns :: foo :: bar (T*)
{
return 0;
}
namespace ns
{
template <>
int foo :: bar <int> (int *)
{
return 1;
}
}
为什么第二个定义必须在一个namespace ns {}
块中,而第一个定义非常愉快地使用限定名称定义?这只是语言设计的疏忽还是有原因?