3

我正在尝试为简单的复数操作编写一些代码。我正在使用模板类,但在重载运算符(特别是 +、-、*、/)时遇到问题。我试图在我的模板类中声明重载,然后在同一个头文件中定义它们。

我的标题代码如下:

#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++ 的初学者,并试图拼凑本网站上其他问题的解决方案,这可能意味着我的代码有点混乱——我道歉!

任何帮助将不胜感激。

4

4 回答 4

2

for 的声明complex<T>::operator+正在返回,complex<T>而定义正在返回 a 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() );
    }
};
于 2012-04-13T15:32:34.917 回答
0

您将声明与定义不匹配。更改此行:

template <class T> complex<T>& complex<T>::operator+(const complex &C){

对此

template <class T> complex<T> complex<T>::operator+(const complex &C){

(注意缺少的“&”)

于 2012-04-13T15:32:19.120 回答
0

这应该有效:

template <class T> complex<T> complex<T>::operator+(const complex<T> &C){ 
  complex<T> A(re+C.realcomp(),im+C.imagcomp()); 
  return A; 
} 

返回值被声明为类中的一个对象,并且参数中缺少模板参数

于 2012-04-13T15:32:56.497 回答
0

您正在返回一个局部变量作为参考。加上声明不同:

您声明返回一个复合体,而在定义时您返回一个复合体&

于 2012-04-13T15:34:21.940 回答