【问题标题】:Overloading addition operator inside a template class在模板类中重载加法运算符
【发布时间】:2012-04-13 15:26:41
【问题描述】:

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

我的头代码如下:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ templates operator-overloading


    【解决方案1】:

    complex&lt;T&gt;::operator+ 的声明返回 complex&lt;T&gt;,而定义返回 complex&lt;T&gt;&amp;。您希望按值返回对象,而不是引用。

    另外,模板类的函数定义必须在头文件中,因为编译器在实例化模板时需要能够看到这些,所以将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() );
        }
    };
    

    【讨论】:

    • 谢谢。正是我想要的!出于兴趣,如果我使用构造函数初始化列表来初始化成员变量有什么好处?
    • @user1331900 this question 的答案总结得很好
    【解决方案2】:

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

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

    到这里

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

    (注意缺少的“&”)

    【讨论】:

      【解决方案3】:

      这应该可行:

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

      返回值声明为类中的对象,而patameter缺少模板参数

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-10-15
          • 2016-06-21
          • 2016-02-28
          • 2020-10-17
          • 2012-02-07
          • 2016-04-21
          • 2013-03-24
          • 1970-01-01
          • 2023-04-05
          相关资源
          最近更新 更多