类 - 命名空间和模板成员函数专门化

时间:2014-01-27 19:03:10

标签: c++ templates gcc

我有这段代码:

在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)'的特化   在不同的命名空间

2 个答案:

答案 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)
{
}
相关问题