为什么模板类的显式方法专门化在没有类内部的原型声明的情况下工作

时间:2015-10-06 15:25:29

标签: c++ templates gcc

我正在使用以下简单示例

struct foo
{
    template <typename t>
    void funct(t a , t b)
    {
        std::cout << "Primary template called";
    }
};

template<>
void foo::funct<std::string> (std::string a , std::string b)
{
   std::cout << "Specialized";
}

上面的代码很好并且运行,但是我有点困惑在类之外声明的方法:

    template<>
    void foo::funct<std::string> (std::string a , std::string b)
    {
       std::cout << "Specialized";
    }

在课堂上甚至没有签名。我假设上面的代码可以工作,即使我将方法的签名添加到类中并使它看起来像这样不幸的是错误

struct foo
{
    template <typename t>
    void funct(t a , t b)
    {
        std::cout << "Primary template called";
    }

    template<>                                                 ---->Added Extra
    void funct<std::string> (std::string a , std::string b);   ----->Added Extra
};

 template<>
    void foo::funct<std::string> (std::string a , std::string b)
    {
       std::cout << "Specialized";
    }

我的问题是为什么它会像这样? class / struct之外的方法假设有一个带签名的方法

  funct(std::string a , std::string b);

但没有。如果有人能解释这种行为,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

显式特化将导致隐式实例化,无需在此明确声明它。

14.7.3 $ 6显式专业化[temp.expl.spec]

  

如果是模板,成员模板或类模板的成员   明确专业化然后宣布专业化   在第一次使用该特化之前会导致一个   隐式实例化发生在每个翻译单元中   发生了这种用途;无需诊断。

并且,显式专业化不能在类范围内声明。

14.7.3 $ 2显式专业化[temp.expl.spec]

  

应在包含的名称空间中声明显式特化   专业模板。

所以,如果你想,你可以在类范围之外明确地添加显式特化声明,即使这里没有多大意义。

template<>
void foo::funct<std::string> (std::string a , std::string b);

LIVE