【问题标题】:Class template and friendship类模板和友谊
【发布时间】:2021-12-06 21:38:14
【问题描述】:

我有这个关于类模板和朋友的例子:

template <typename T>
class Foo;

template <typename T>
std::ostream& operator<<(std::ostream&, Foo<T> const&);

template <typename T>
std::istream& operator>>(std::istream&, Foo<T>&);

template <typename T>
class Foo{
private:
    int x = 10;
    friend std::ostream& operator<< <T>(std::ostream&, Foo const&);
    friend std::istream& operator>> <>(std::istream&, Foo&);
};

template <typename T>
std::ostream& operator<<(std::ostream& os, Foo<T> const& f){
    return os << f.x;
}

template <typename T>
std::istream& operator>>(std::istream& is, Foo<T>& f){
    return is >> f.x;
}


int main(){

    Foo<double> fd;
    std::cin >> fd;
    std::cout << fd << '\n';

    std::cout << '\n';
}
  • 工作很好,但我想知道插入运算符 &lt;&lt; 友谊类型和提取运算符 &gt;&gt; 友谊类型到类 Foo 之间的区别。

  • ...operator&lt;&lt; &lt;T&gt;.. 用于实例化Foo 的同一类型的输出运算符的每个实例化是它的朋友吗?那么这是一对一的友谊吗?

  • 让我困惑的是提取运算符:operator &gt;&gt; &lt;&gt;(...:这是什么意思?这是一个完整的专业化吗?

【问题讨论】:

    标签: c++ templates friend class-template


    【解决方案1】:

    工作很好,但我想知道插入之间的区别 运算符&lt;&lt;友谊类型和提取运算符&gt;&gt;友谊 输入类Foo

    它们在这里具有相同的效果。

    ...operator&lt;&lt; &lt;T&gt;.. 是否表示输出的每个实例化 用于实例化Foo 的同一类型的运算符是它的朋友吗?所以 这是一对一的友谊吗?

    是的。对于Foo&lt;double&gt;,只有operator&lt;&lt; &lt;double&gt;operator&gt;&gt; &lt;double&gt; 是朋友。

    让我困惑的是提取运算符:operator&gt;&gt; &lt;&gt;(...: What 意思是不是?这是一个完整的专业化吗?

    模板实参推导确定T的类型(基于第2个函数参数;FooFoo&lt;T&gt;相同),则友元声明引用推导的T的实例化。这与将模板参数T 指定为operator&gt;&gt; &lt;T&gt;(... 相同。

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多