模板特化的问题在于它们被视为普通函数,因为在任何地方都不再使用模板参数。
因此,如果将以下代码放在头文件中,它首先会起作用。
template <typename foo>
void f(foo p)
{
std::cout << "f one" << std::endl;
}
template <>
void f<int>(int p)
{
std::cout << "f two" << std::endl;
}
但是,如果标头包含在两个文件中,这将停止工作。在这种情况下,我得到的错误(使用 VS2010)是:
templateordering.obj : error LNK2005: "void __cdecl f<int>(int)" (??$f@H@@YAXH@Z) already defined in othertu.obj
这可以通过使用许多其他问题中提到的inline关键字来解决。
template <>
inline void f<int>(int p)
{
std::cout << "f two" << std::endl;
}
现在这对我提出了两个问题:
- 有没有其他方法可以做到这一点?将专门的功能放在源文件中似乎不起作用。可能是因为我需要在标题中进行某种声明。
- 内联实际上是做什么的?不应该使用 inline 似乎是整个互联网的普遍经验法则,因为编译器“在任何情况下都可能以他喜欢的方式内联函数”。因此,如果编译器可能不会内联我声明为“内联”的函数,为什么会这样呢?