关于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是该模板类声明结束的行。
虽然编译器说是语法问题,可是我单独注释掉一元版本的声明和定义,编译通过可实现功能,单独注释掉二元版本的,一元版本的也变异通过并实现功能。但是两个版本同时存在就不行了。为什么? 展开
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
}
调试通过
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
}
调试通过
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询