此代码将放在头文件中:
template<typename TTT>
inline Permutation<TTT> operator * (const Cycle<TTT>& cy, const Permutation<TTT>& p)
{
return Permutation<TTT>(cy)*p;
}
Run Code Online (Sandbox Code Playgroud)
有inline必要避免链接器错误吗?
如果此函数不是模板并且头文件用于多个.cpp文件,inline则必须避免抱怨函数的多个定义的liker错误.似乎链接器忽略了这个模板.
有
inline必要避免链接器错误吗?
在功能模板上,没有.模板(如内联函数)受制于更宽松的单一定义规则,该规则允许多个定义 - 只要定义相同且在单独的翻译单元中.
如你所说,inline如果你想在标题中定义一个非模板函数,那将是必要的; 非内联函数受更严格的单定义规则约束,并且在程序中只能有一个定义.
对于血淋淋的细节,这是由C++ 11 3.2/5指定的:
可以有多个类类型的定义,带有外部链接的内联函数,类模板,非静态函数模板,类模板的静态数据成员,类模板的成员函数或模板特化,其中有一些模板参数如果每个定义出现在不同的翻译单元中,并且定义满足以下要求,则不在程序中指定.
("以下要求"基本上说定义必须相同).