我有一个与模板化运算符的友谊>>成立:
class MyInputStream
{
...
private:
std::istream& impl;
template<class T>
friend MyInputStream& operator>> (MyInputStream& stream, T& outParam);
}
现在我定义了运算符&gt;&gt;
template<class T>
MyInputStream& operator>> (MyInputStream& stream, T& outParam)
{
stream.impl >> outParam;
return stream;
}
一切正常。
但是当我添加模板的特化时会出现问题,例如&#34; int&#34;模板参数
template<>
MyInputStream& operator>> (MyInputStream& stream, int& outParam)
{
stream.impl >> outParam;
return stream;
}
然后我得到链接错误,即int的模板运算符已经在.obj文件中定义。 请告诉我应该做些什么。
答案 0 :(得分:3)
函数模板的显式特化与任何其他函数一样,必须只定义一次。
在标头中声明特化并在.cpp
文件中定义,或在标题中将其定义为inline
。
您还需要确保在使用函数模板导致int
的函数模板的隐式实例化之前声明特化。如果没有在需要的地方声明特化,那么主模板将用于生成隐式实例化。
(N.B。这与作为朋友的函数没有任何关系,相同的规则适用于所有函数模板特化)