【问题标题】:Operator overloading error "binary '+' : no operator found which takes a left-hand operand"运算符重载错误“二进制'+':未找到采用左操作数的运算符”
【发布时间】:2014-05-02 07:15:23
【问题描述】:
class CFruit { 
private: 
 string m_name; 
public: 

 string getName() const; 

 CFruit(string name = "NoName"); 
};

fruitsalad 在 CFruitSalad 类中表示:

class CFruitSalad { 
//Overloaded Operators 
friend ostream& operator <<(ostream& out, const CFruitSalad& f); 
friend CFruitSalad operator +(const CFruit& f1, const CFruit& f2); 

private: 
 string m_fruitsalad; 
public: 

 CFruitSalad(string content = ""); 
 string getName() const; 
};

现在当我使用时写这个:

 CFruit f1("Apple"); 
 CFruit f2("Orange"); 
 CFruit f3 ("Banana"); 
 CFruitSalad fs; 
 fs = f1 + f2 + f3; //this line generates the error 
 cout << "Content: " << fs << endl; 

编译程序时收到以下错误: 错误 C2678:二进制“+”:未找到采用“CFruitSalad”类型的左侧操作数的运算符 (或者没有可接受的转换)

为什么会出现此错误以及如何解决?

【问题讨论】:

  • 将第一个参数的类型从CFruit改为CFruitSalad

标签: c++ operators operator-overloading


【解决方案1】:

您的+ 运算符仅在CFruit 类的两个实例之间定义。您需要为CFruitSaladCFruit 添加另一个operator +,或使用converting constructor(请参阅选中的答案)。

【讨论】:

    【解决方案2】:
      fs = f1 + f2 + f3; 
    

    无论评估顺序如何(假设首先评估f2+ f3),它都会根据您在此处的声明首先返回一个CFruitSalad的对象:

    friend CFruitSalad operator +(const CFruit& f1, const CFruit& f2);
    

    现在,对于下一个+ 操作,您将添加一个CFruit 对象和一个CFruitSalad 对象,您没有一个需要一个CFruit 和一个CFruitSalad 的重载版本,这会导致错误。

    您需要更改重载operator+ 的实现(恕我直言,如果它没有真正意义,请不要重载运算符)。

    【讨论】:

      【解决方案3】:

      fs = f1 + f2 + f3; //this line generates the error

      好的,那么操作时间的顺序。

      f1 + f2 调用 operator+ 并返回一个 CFruitSalad 对象,我们将其称为 _f4

      然后_f4 + f3 发生,它试图调用operator+ (CFruitSalad const &amp;, CFruit const &amp;),导致你的错误。

      【讨论】:

        【解决方案4】:

        您将运算符 + 定义为

        friend CFruitSalad operator +(const CFruit& f1, const CFruit& f2); 
        

        即具有返回类型 CFruitSalad

        二元运算符 + 从左到右计算。所以在这个声明中

        fs = f1 + f2 + f3;
        

        在评估f1 + f2 之后,您会得到一个类型为 CFruitSalad 的临时对象,并尝试将其添加到类型为 CFruit 的对象 f3 中。但是,您没有定义具有 CFruitSalad 类型的左操作数和 CFruit 类型的右操作数的运算符 + 并且没有可以转换一种类型的对象的转换函数到另一个。

        所以编译器发出错误。

        您可以将运算符声明为

        friend CFruitSalad operator +(const CFruitSalad& f1, const CFruit& f2); 
        

        或者可以使它成为 CFruitSalad 类的成员函数。例如

        CFruitSalad operator +( const CFruit& f2) const; 
        

        还有一种意义是声明operator +=而不是运算符+ 例如

        CFruitSalad & operator +=( const CFruit& f2); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-03
          • 1970-01-01
          • 1970-01-01
          • 2019-07-31
          • 1970-01-01
          相关资源
          最近更新 更多