我正在尝试为简单的复数操作编写一些代码。我正在使用模板类,我在重载运算符时遇到问题(特别是+, - ,*,/)。我试图在模板类中声明重载,然后在同一个头文件中定义它们。
我的标题代码如下:
#ifndef MY_CLASS_H
#define MY_CLASS_H
template <class T> class complex
{
private:
T re,im;
public:
// Constructors & destructor
complex(){re=im=0;}
complex(T r, T i){re=r; im=i;}
~complex(){}
// Return real component
T realcomp() const {return re;}
// Return imaginary component
T imagcomp() const {return im;}
// Overload + operator for addition
complex<T> operator+(const complex<T> &C);
....
};
#endif
#include<iostream>
#include<cmath>
using namespace std;
template <class T> complex<T>& complex<T>::operator+(const complex &C){
complex<T> A(re+C.realcomp(),im+C.imagcomp());
return A;
}
这会返回到目前为止我无法解决的错误,而且我不确定我哪里出错了。我是C ++初学者并试图将解决方案与本网站上的其他问题拼凑在一起的混合物可能意味着我的代码有点乱 - 我道歉!
非常感谢任何帮助。
答案 0 :(得分:2)
complex<T>::operator+
的声明在定义返回complex<T>
时返回complex<T>&
。您希望按值返回对象,而不是引用。
此外,模板类必须在头文件中包含其函数定义,因为编译器在实例化模板时需要能够查看,因此将operator+
定义移动到头文件。
您还应该使用构造函数初始化列表来初始化成员变量。
template <class T> class complex
{
private:
T re,im;
public:
// Constructors & destructor
complex() : re(), im() {}
complex( const T& r, const T& i ) : re(r), im(i) {}
~complex(){}
// Return real component
T realcomp() const {return re;}
// Return imaginary component
T imagcomp() const {return im;}
// Overload + operator for addition
complex<T> operator+(const complex<T> &C)
{
return complex<T>( re + C.realcomp(), im + C.imagcomp() );
}
};
答案 1 :(得分:0)
您将声明与定义不匹配。改变这一行:
template <class T> complex<T>& complex<T>::operator+(const complex &C){
到这个
template <class T> complex<T> complex<T>::operator+(const complex &C){
(请注意缺少&#34;&amp;&#34;)
答案 2 :(得分:0)
这应该有效:
template <class T> complex<T> complex<T>::operator+(const complex<T> &C){
complex<T> A(re+C.realcomp(),im+C.imagcomp());
return A;
}
返回值被声明为类中的对象,而patameter缺少模板参数
答案 3 :(得分:0)
您将返回一个局部变量作为参考。加上声明是不同的:
您声明要在定义时返回复数,并返回复数&amp;