关于C++模板类友元重载算符的问题。

设计了一个模板类,类中希望重载算符“+”,一元运算符+作为成员函数,二元运算符+作为该模板类的友元函数,都采取类外定义的方式。声明和定义如下:template<typen... 设计了一个模板类,类中希望重载算符“+”,一元运算符+作为成员函数,二元运算符+作为该模板类的友元函数,都采取类外定义的方式。声明和定义如下:
template<typename _Ty>
class SomeClass;
template<typename _Ty>
SomeClass<_Ty> operator+(const SomeClass<_Ty> &lhs, const SomeClass<_Ty> &rhs);

template<typename _Ty>
class SomeClass {
//.......
SomeClass<_Ty> operator+() const;
friend SomeClass<_Ty> operator+<_Ty>(const SomeClass<_Ty> &lhs, const SomeClass<_Ty> &rhs);//这里是54行
//...
};//这里是63行

template<typename _Ty>
SomeClass<_Ty> SomeClass<_Ty>::operator+() const{
//do something and return
}

template<typename _Ty>
SomeClass<_Ty> operator+(const SomeClass<_Ty> &lhs, const SomeClass<_Ty> &rhs){
//do something and return
}

单独定义一元版本的+或者单独定义二元版本的+都不会有问题,但是同时定义这两个版本的话,编译就无法通过了,诊断信息大概是编译器没办法识别二元版本的友元声明那一行。
(54): error C2143: 语法错误 : 缺少“;”(在“<”的前面)
(63): 参见对正在编译的类 模板 实例化“SomeClass<_Ty>”的引用
(54): error C2460: “+”: 使用正在定义的“SomeClass<_Ty>”
(54): error C2433: “+”: 不允许在数据声明中使用“friend”
(54): error C2365: “operator +”: 重定义;以前的定义是“函数”
(54): error C2238: 意外的标记位于“;”之前
54行就是友元二元+运算符声明的那一行,63是该模板类声明结束的行。
虽然编译器说是语法问题,可是我单独注释掉一元版本的声明和定义,编译通过可实现功能,单独注释掉二元版本的,一元版本的也变异通过并实现功能。但是两个版本同时存在就不行了。为什么?
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)
匿名用户
推荐于2016-09-08
展开全部
template<typename _Ty>
class SomeClass;
template<typename _Ty>
SomeClass<_Ty> operator+(const SomeClass<_Ty> &lhs, const SomeClass<_Ty> &rhs);
template<typename _Ty>
SomeClass<_Ty> operator+(const SomeClass<_Ty>&);

template<typename _Ty>
class SomeClass {
//.......

friend SomeClass<_Ty> operator+<_Ty>(const SomeClass<_Ty> &lhs, const SomeClass<_Ty> &rhs);//这里是54行
public:
SomeClass<_Ty> operator+(const SomeClass<_Ty> &lhs);
//...
};//这里是63行

template<typename _Ty>
SomeClass<_Ty> SomeClass<_Ty>::operator+(const SomeClass<_Ty> &lhs){
//do something and return
}

template<typename _Ty>
SomeClass<_Ty> operator+(const SomeClass<_Ty> &lhs, const SomeClass<_Ty> &rhs){
//do something and return
}
调试通过
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式