首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“多个运算符+匹配这些操作数”错误

“多个运算符+匹配这些操作数”错误
EN

Stack Overflow用户
提问于 2012-04-27 08:21:26
回答 2查看 11.8K关注 0票数 3

我正在为一项学校作业创建一个金钱类。我定义了一个从Money到double的转换,我有一个Money的构造函数,它接受一个int,另一个构造函数接受一个double,我重载了"+“运算符,将两个Money类型的对象相加在一起。当我尝试执行类似myMoney + 10的操作时,出现错误消息,其中myMoney是Money类型的对象,而10显然是一个整数。下面是相关代码的其余部分:

代码语言:javascript
运行
复制
class Money {
private:
    int dollars;
    int cents;
public:
    Money(double r);
    Money(int d) : dollars(d), cents(0) {}
    operator double();
}

Money operator+(Money a, Money b) {
    double r = double(a) + double(b);
    return Money(r);
}

Money::operator double() {
    return dollars+double(cents)/100;
}

Money::Money(double r) {
    ...
}

如果我尝试Money(double(myMoney)+10),并且我显式地将两个构造函数都设置为显式,那么程序实际上是有效的,但是我不确定我是否理解了自动转换发生了什么。有人能解释这种行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-27 08:31:16

代码语言:javascript
运行
复制
MyMoney + 10

因为没有operator+(Money, int),所以必须在这里进行一些转换。编译器可以将Money转换为double,然后将10转换为“double”并选择内置的operator+(double,double),也可以将int转换为Money并选择您的operator+(Money,Money)

票数 4
EN

Stack Overflow用户

发布于 2012-04-27 09:26:43

正如编译器所看到的,正如本杰明所指出的,问题是有两个转换序列导致operator+重载的不同有效参数集。但这实际上表明了设计中存在更深层次的问题。隐式转换应该很少使用,并且有两种不同类型的隐式转换会导致问题。

考虑使构造函数显式,或者使转换操作符也显式(C++11语言特性),或者删除它们并提供命名转换(通过成员函数而不是操作符),就像std::string::c_str()中的情况一样。

任何东西都会自动变成钱,这真的有意义吗?就像它很容易变成灰尘一样?学习让编译器通过避免削弱类型系统的隐式转换来帮助您检测逻辑问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10343161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档