我正在使用以下简单示例
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);
但没有。如果有人能解释这种行为,我将不胜感激。
答案 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);