运算符重载 - 不匹配

abc*_*abc 0 c++ operator-overloading

运算符重载有点问题.我有两节课.

#include <iostream>
using namespace std;

    class Meter; //Forward declaration        

    class Inch{
    private:
        double inches;

    public:
        Inch() : inches(0) {}
        Inch(double i) { inches=i; }
        friend Inch operator+ (const Meter& m, const Inch& i);
        void out(){ cout << "Inch:" << inches << "\n";  }
        double getInches() const { return inches; }
    };
Run Code Online (Sandbox Code Playgroud)

class Meter{
private:
    double meter;    
public:
    Meter() : meter(0) {}
    Meter(double m) { meter=m; }
    Meter operator+ (const Inch& i) { return Meter(meter + i.getInches() * 0.0254); }    
    void out(){ cout << "Meter:" << meter;  }
    double getMeter() const { return meter; }
};

Inch operator+ (const Meter& m, const Inch& i)
{ return Inch(m.getMeter()/0.0254 + i.getInches()); }
Run Code Online (Sandbox Code Playgroud)

主要是我有这些类中的一个.我需要将它们与顺序一起添加:m + i;所以m必须是第一个对象.为了做到这一点,我使用了友元函数,以便使用两个对象作为参数.

Inch i(6.4), resultInch; 
Meter m(14), resultMeter; 

i.out(); 
m.out();  

resultMeter = m + i; 
resultMeter.out(); 

resultInch = m + i; 
resultInch.out();
Run Code Online (Sandbox Code Playgroud)

有了上面的,resultMeter保持正确的值,但是当我把resultInch编译器给出"错误不匹配bla bla bla".

我错过了什么?

Dav*_*eas 7

问题是这两个运算符都是+代码完全相同的重载.您可以在同一程序中使用一个或另一个,但不能同时使用两个.

Inch operator+ (const Meter& m, const Inch& i);
class Meter{
   Meter operator+ (const Inch& i);
};
Run Code Online (Sandbox Code Playgroud)

考虑如果你有一个Meter m;并且Inch i;你试图添加它们会发生什么m + i,应该调用哪个运算符实现?

  • @mertmetin:那是给你定义的,不适合我.我个人会按照本杰明的建议,米和英寸不是真正的实体,实体是*长度*,可以用米或英寸来衡量....(实际上,我是SI的坚定信徒,并认为帝国制度应该放逐,如果这是一个答案:) (2认同)
  • @mertmetin:我可能会给你两三种方法来进行编译,但是你会失败.我觉得你不太明白被问到什么,直到你明白什么是真正被问到的.你应该先做这件事.请注意,只提供一种解决方案而不是争论它更简单,但这对您没有帮助. (2认同)