首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局operator<<与成员operator<<共存

全局operator<<与成员operator<<共存
EN

Stack Overflow用户
提问于 2013-05-02 21:32:00
回答 2查看 140关注 0票数 2

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

代码语言:javascript
复制
#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 );

错误:

代码语言:javascript
复制
$ 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

我为我糟糕的英语感到抱歉。出于这个原因,我写得很少。

问候和感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-05-02 21:55:07

我认为你想要:

代码语言:javascript
复制
friend std::ostream& operator<< <T>( ... );

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

票数 0
EN

Stack Overflow用户

发布于 2013-09-06 02:03:09

我找到了一个变通的解决方案:

代码语言:javascript
复制
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的作用域内重新声明模板参数,编译器会报错。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16339372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档