我有这段代码:
在A.h
namespace MyUtils
{
class A
{
public:
A();
~A();
template <typename T> Set(T val);
template <typename T> Set(T * val);
}
template <typename T>
void A::Set(T * val)
{
}
}
在A.cpp中,我有这个
using namespace MyUtils;
template <>
void A::Set<int>(int val)
{
}
template <>
void A::Set<char *>(char * val)
{
}
这种逻辑在MSVC或Xcode中编译正常。但是在Linux上,使用gcc(g ++),我得到了
错误:'template void MyUtils :: A :: Set(T)'的特化 在不同的命名空间
答案 0 :(得分:1)
MSVC和Xcode中的错误。
从14.7.2显式实例化:
显式实例化应出现在封闭的命名空间中 它的模板。
答案 1 :(得分:0)
我也认为这是一个错误,因为根据C ++标准(第14.7.3节明确的专业化)
2应在命名空间中声明显式特化 封闭专门的模板。一个明确的专业化 declarator-id不合格,应在最近的声明 封闭模板的命名空间,或者,如果命名空间是内联的 (7.3.1),来自其封闭命名空间集的任何命名空间。这样的 声明也可以是一个定义。如果声明不是 定义,专业化可以在以后定义(7.3.1.2)。
所以你应该使用完全限定名称
template <>
void MyUtils::A::Set<int>(int val)
{
}