【问题标题】:Coexistence among global operator<< and member operator<<全局操作符<<和成员操作符<<共存
【发布时间】:2013-05-02 13:31:59
【问题描述】:

有谁知道如何让这两个重载的操作符共存?

#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

对不起,我的英语不好。因此我很少写。

问候和感谢!

【问题讨论】:

  • 您遇到错误了吗?
  • g++ 版本 4.7.3 编译器抛出此错误:prov.cpp:13:33:错误:将 'operator 之前预期的 unqualified-id
  • 我也遇到了同样的问题,发现加上using namespace std;然后编译器就不会报错了。但我还是没找到原因。

标签: c++ operator-overloading


【解决方案1】:

我想你想要:

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

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

【讨论】:

    【解决方案2】:

    我找到了解决方法:

    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类的作用域内重新声明模板参数,编译器会报错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2013-11-02
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多