【问题标题】:Operator = function and an add function cant seem to coexistOperator = function 和 add function 似乎不能共存
【发布时间】:2012-02-09 04:24:27
【问题描述】:

我的两个函数有问题。我有一个operator = 方法和一个add 方法。它们自己工作正常,因为我只能在一次编译期间使用其中一个。例如,我需要注释掉 add 函数才能使 operator = 方法起作用,反之亦然。我得到的错误 10 no match for 'operator=' in 'c = (&a)->HUGE_INT::add(((HUGE_INT&)(&b)))'

     HUGE_INT HUGE_INT::operator=(HUGE_INT &orig)
        {
        //code
         return *this;
        }

        HUGE_INT HUGE_INT::add(HUGE_INT &a)
        {
         //code
         return object;
        }

//client
    HUGE_INT a(9999999),b(1111),c,d;
       c = a.add(b);
       d = a;

【问题讨论】:

  • 您能否发布描述错误的最简单示例 - 您认为应该编译但由于您询问的特定错误而无法编译的代码。
  • 就像我说的,当它们是客户端中唯一使用的函数时,这些函数可以正常工作,但是当两者都被调用时,问题就来了
  • 我现在看到了,add 返回一个临时值,operator= 需要一个非常量引用。您不能形成对临时对象的非常量引用。

标签: c++ class operator-overloading


【解决方案1】:

您遇到的问题是您从add 按值返回,并通过非常量引用将参数传递给operator=

add 返回的临时对象是一个右值,因此不能绑定到非常量引用。

除非你正在做一些非常奇怪的事情,否则你可能想要更改 operator= 以通过引用 const 来获取其参数:

    HUGE_INT& HUGE_INT::operator=(HUGE_INT const& orig)
    {
    //code
     return *this;
    }

(我也将其更改为通过引用返回,因为这是operator= 的标准签名。)

【讨论】:

    【解决方案2】:

    我为您修复了代码,当然它现在没有像您的示例那样做任何事情,但它可以编译。 原因是您需要将“=”运算符的参数指定为常量,并且如其他海报所述,您还应该返回对该对象的引用。

    class HUGE_INT
    {
    public:
    HUGE_INT(){this->var = 0;}
    HUGE_INT(int v){this->var = v;};
    
    HUGE_INT& operator=(const HUGE_INT &orig)
    {
    
     return *this;
    }
    
    HUGE_INT add(HUGE_INT &a)
    {
        HUGE_INT object;
     return object;
    }
    
    private:
        int var;
    };
    
    
    int main()
    {
    
    
    //client
    HUGE_INT a(9999999),b(1111),c,d;
       c = a.add(b);
       d = a;
    }
    

    为了更好地理解运算符重载,请查看 atutorial

    【讨论】:

      【解决方案3】:

      您的 operator= 应该返回一个引用以及获取一个 const 引用;也就是说,它应该有一个签名HUGE_INT& HUGE_INT::operator=(const HUGE_INT& orig)

      顺便说一句,在类名中使用全部大写字母是非常糟糕的 C++ 风格。所有大写字母通常都保留给宏。

      【讨论】:

        猜你喜欢
        • 2018-11-17
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 2021-11-09
        • 2020-06-23
        相关资源
        最近更新 更多