朋友模板功能规范

时间:2014-09-11 14:12:47

标签: c++ templates friend

我有一个与模板化运算符的友谊>>成立:

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文件中定义。 请告诉我应该做些什么。

1 个答案:

答案 0 :(得分:3)

函数模板的显式特化与任何其他函数一样,必须只定义一次。

在标头中声明特化并在.cpp文件中定义,或在标题中将其定义为inline

您还需要确保在使用函数模板导致int的函数模板的隐式实例化之前声明特化。如果没有在需要的地方声明特化,那么主模板将用于生成隐式实例化。

(N.B。这与作为朋友的函数没有任何关系,相同的规则适用于所有函数模板特化)