模板定义中的友元函数

时间:2010-01-16 09:39:40

标签: c++ templates friend-function

我的问题与this一个问题有关。

我想重载运算符<<对于某些课程,我发现两种不同的符号都有效:

template <class T>
class A{
  T t;
public:
  A(T init) : t(init){}
  friend ostream& operator<< <> (ostream &os, const A<T> &a); //need forward declaration
  //template <class U> friend ostream& operator<< (ostream &os, const A<U> &a);
};

我是否用不同的符号定义相同的东西?或者是第一个版本更具限制性,在哪个实例(在这种情况下只有与我的类A具有相同T的实例)的&lt;&lt;是A的朋友?

2 个答案:

答案 0 :(得分:1)

第一个版本将友情限制为operator<<针对特定类型A<T>,而第二个版本将operator<<限制为A<SomeType>朋友。

所以是的,第一个更具限制性:

template<class T>
ostream& operator<< (ostream& os, const A<T>& a) {
    A<double> b(0.0);
    b.t; // compile error with version 1, fine with version 2
    return os;
}

int main() {
    A<int> a(0);
    cout << a << endl;
}

答案 1 :(得分:0)

友好函数的定义恰好是模板的例外。它允许你写这个:

template <class T>
class A{
  T t;
public:
  A(T init) : t(init){}
  friend ostream& operator<<(ostream &os, const A &a)
  {  // Implementation in the class
  }
};

它的优点是可以为您创建的每个A<T>实例自动创建一个普通函数。

供参考:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16