不同类型的算术运算符重载c ++

arithmetic operator overload c++ for different types

我有一个 class 'number',其中有一个成员 'm_value' int64_t。我已经重载了 += 运算符,有代码:

number& operator+=(const number& right);

并且它适用于不同类型(例如 int、int64_t、short 等)。以同样的方式我重载了 + operator:

number operator+(const number& right);

但是当我尝试添加 class object 和 int64_t 变量时,它给出了以下错误:

use of overloaded operator '+' is ambiguous (with operand types 'number' and 'int64_t' (aka 'long'))

当然,我可以为其他类型重载运算符,但我想知道这个问题是否有另一种解决方案,以及为什么在第一个运算符的情况下,从一种类型到另一种类型的转换会自动发生?

多谢指教!

更新:这里是 class header:

class number {
private:
    int64_t m_value;
public:
    number();
    number(int64_t value);
    number(const number& copy);
 
    number& operator=(const number& other);
 
    number& operator++();
    number operator++(int);
 
    number& operator--();
    number operator--(int);
 
    number& operator+=(const number& right);
    number& operator-=(const number& right);
    number& operator*=(const number& right);
    number& operator/=(const number& right);
    number& operator%=(const number& right);
 
    number& operator&=(const number& right);
    number& operator|=(const number& right);
    number& operator^=(const number& right);
 
    number operator+(const number& right);
    number operator-(const number& right);
    number operator*(const number& right);
    number operator/(const number& right);
    number operator%(const number& right);
    
    number operator&(const number& right);
    number operator|(const number& right);
    number operator^(const number& right);
 
    operator bool() const;
    operator int() const;
    operator int64_t() const;
    operator std::string() const;
 
    friend std::ostream& operator<<(std::ostream& out, const number& num);
    friend std::istream& operator>>(std::istream& in, number& num);
};

您的类型和 int64_t 之间有 隐式 转换双向。这是在自找麻烦,其方式可能比您刚刚发现的更多。

假设

number x;
int64_t y;

表达式 x + y 可以用两种方式解析,如 x + (number)y(int64_t)x + y。没有一个比另一个更好,因此模棱两可。

有几种方法可以解决这个问题。

  • 进行其中一项转换 explicit
  • 同时进行 次转换 explicit 并且不要使用像 x + y.
  • 这样的表达式
  • 进行两个转换 explicit 并定义(很多很多)采用 numberint64_t 操作数的重载。