几个关键点:
需要前置声明!--奇怪的是别人告诉我也可以不需要,但我这里不行!
友元函数的函数名后面的<>,必须要有。
1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 5 //前置声明,你妹啊 6 template<class T> class A; 7 template<class T> ostream &operator<< (ostream &out, const A<T> &_a); 8 template<class T1, class T2> class B; 9 template<class T1, class T2> ostream &operator<< (ostream &out, const B<T1, T2> &_b); 10 11 template<class T> class A 12 { 13 public: 14 A(){} 15 A(T _a, T _b):a(_a),b(_b){} 16 ~A(){} 17 private: 18 T a; 19 T b; 20 21 friend ostream &operator<< <> (ostream &out, const A<T> &a); 22 }; 23 24 template<class T> ostream &operator<< (ostream &out, const A<T> &_a){ 25 out<<_a.a<<"--"<<_a.b; 26 return out; 27 } 28 29 template<class T1, class T2> class B: public A<T1> 30 { 31 public: 32 B(){} 33 B(T1 _a, T1 _b, T2 _c):A<T1>(_a,_b),c(_c){} //A<T1> 34 ~B(){} 35 private: 36 T2 c; 37 38 friend ostream &operator<< <>(ostream &out, const B<T1, T2> &_b); 39 }; 40 template<class T1, class T2> ostream &operator<< (ostream &out, const B<T1, T2> &_b){ 41 // out<<(A<T1>)_b; 42 // out<<"--"<<_b.c; 43 44 out<<(A<T1>)_b<<"--"<<_b.c; 45 return out; 46 } 47 48 int main(int argc, char const *argv[]) 49 { 50 A<int> x(1, 3); 51 B<char, int> y('a', 'b', 5); 52 53 cout<< x <<endl; 54 cout<< y <<endl; 55 56 return 0; 57 }