2

有谁知道如何使这两个重载运算符共存?

#include<iostream> 

template< typename T > 
class A; 

template< typename T > 
std::ostream& operator<<( std::ostream& o, const A<T>& e ); 

template< typename T > 
class A 
{ 
   A& operator <<( const A& e ); 
   friend std::ostream& operator<< <>( std::ostream& o, const A<T>& e ); 
}; 

int main() 
{ 
   // program
   return 0; 
} 

// def A<T>::A& A::operator <<( const A& e ); 
// def std::ostream& operator<< <>( std::ostream& o, const A<T>& e );

错误:

$ g++ prov.cpp -o prov
prov.cpp:13:33: error: declaration of ‘operator<<’ as non-function
prov.cpp:13:33: error: expected ‘;’ at end of member declaration
prov.cpp:13:36: error: expected unqualified-id before ‘&lt;’ token

我很抱歉我的英语不好。出于这个原因,我很少写。

问候和感谢!

4

2 回答 2

0

我找到了一个解决方法:

template< typename T > 
class A 
{ 
   A& operator <<( const A& e ); 
   template< typename T1 > 
   friend std::ostream& operator<< ( std::ostream& o, const A<T1>& e ); 
}; 

这里需要重命名typename T,否则你会在类 A 的范围内重新声明模板参数,编译器会报错。

于 2013-09-05T18:03:08.540 回答
0

我想你想要:

friend std::ostream& operator<< <T>( ... );

在朋友声明中。(我不确定:我的策略一直是定义朋友inline,所以它是否是模板并不重要。但这看起来像标准中的示例。)

于 2013-05-02T13:55:06.663 回答