我的问题与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的朋友?
答案 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