全球运营商之间的共存<<和成员运营商<<

时间:2013-05-02 13:32:00

标签: c++ operator-overloading

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

#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 ‘<’ token

我很抱歉我的英语不好。因此我写的很少。

致以诚挚的谢意!

2 个答案:

答案 0 :(得分:0)

我想你想要:

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

在朋友声明中。 (我不确定:我的政策一直都是 一直在定义朋友inline,所以无论如何 是模板与否。但这看起来像标准中的例子。)

答案 1 :(得分: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类范围内重新声明模板参数,编译器会抱怨。