代码之家  ›  专栏  ›  技术社区  ›  Alex B.

好友模板功能规范

  •  0
  • Alex B.  · 技术社区  · 10 年前

    我有一个类,其中与模板运算符的友谊>>已确定:

    class MyInputStream
    {
      ...
    private:
       std::istream& impl;
    
       template<class T>
       friend MyInputStream& operator>> (MyInputStream& stream, T& outParam);
    }
    

    现在我定义运算符>>

       template<class T>
       MyInputStream& operator>> (MyInputStream& stream, T& outParam)
       {
           stream.impl >> outParam;
           return stream;
       }
    

    一切都很好。

    但当我添加模板的专用化时,问题就出现了,比如“int”模板参数

       template<>
       MyInputStream& operator>> (MyInputStream& stream, int& outParam)
       {
           stream.impl >> outParam;
           return stream;
       }
    

    然后我得到链接错误,int的模板运算符已经在.obj文件中定义。 请告诉我该怎么做。

    1 回复  |  直到 10 年前
        1
  •  3
  •   Jonathan Wakely    10 年前

    函数模板的显式专用化与任何其他函数一样,只能定义一次。

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

    您还需要确保在函数模板的任何使用都将导致函数模板的隐式实例化之前声明专门化 int 如果尚未在需要的地方声明专用化,则将使用主模板生成隐式实例化。

    (注意:这与作为朋友的函数无关,相同的规则适用于所有函数模板专门化)