不同类型的算术运算符重载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
并定义(很多很多)采用 number
和 int64_t
操作数的重载。
我有一个 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
并定义(很多很多)采用number
和int64_t
操作数的重载。