模板专业化的问题是它们被视为正常的函数,因为没有任何地方使用模板参数了。为什么内联模板专业化有帮助,我应该这样做吗?
因此,如果将下面的代码放在头文件中,它首先工作。
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)" ([email protected]@@[email protected]) already defined in othertu.obj
这是通过使用在线关键字和其他许多问题提到可以解决的。
template <>
inline void f<int>(int p)
{
std::cout << "f two" << std::endl;
}
现在,这引起了我两个问题:
- 是否有任何其他方式做到这一点?将特殊功能放在源文件中似乎不起作用。可能是因为我需要在头文件中进行某种声明。
- 内联实际上做了什么?在互联网上似乎是一个普遍的经验法则,不应该使用内联,因为编译器“可能会以他喜欢的方式在任何情况下内联函数”。因此,如果编译器可能不内联一个我声明为“内联”的函数,为什么这会起作用?
关于你的第一个问题,确实,如果你_do_声明标头中的专业化运作? – 2012-08-01 12:00:27
@CharlesBailey呃,据我所知,只要这个标题只包含在一个翻译单元中就行。但那更像是我的一个实验性猜想。 ;)与内联似乎工作得很好。 – Sarien 2012-08-01 12:01:28
我的意思是_just_是一个声明,而不是仅仅是定义的一部分的声明。 – 2012-08-01 12:07:05