【问题标题】:Friend template function specification好友模板功能说明
【发布时间】:2014-09-11 14:12:47
【问题描述】:

我有一个类与模板化操作符 >> 建立友谊:

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

【问题讨论】:

  • 你把专业化放在 cpp 文件中了吗?
  • 我在你的代码中没有看到friend这个词。
  • 是的,你是对的。已更正
  • 这可以被认为是stackoverflow.com/q/25529893/981959 的重复,尽管这也有关于使用static 的额外问题(这通常不是一个好的解决方案)

标签: c++ templates friend


【解决方案1】:

函数模板的显式特化就像任何其他函数一样,只能定义一次。

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

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

(注意,这与函数是朋友无关,相同的规则适用于所有函数模板特化)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多