![](/img/trans.png)
[英]Overloaded preincrement operator error “more than one operator ++ matches these operands”
[英]“More than one operator + matches these operands” error
我正在為學校作業創建一個Money課程。 我已經定義了從Money到double的轉換,我有一個Money的構造函數,它接受一個int,另一個構造函數接受一個double,我重載了“+”運算符,將兩個Money類型的對象相加。 當我嘗試執行類似myMoney + 10
操作時,會出現錯誤消息,其中myMoney是Money類型的對象,而10顯然是整數。 以下是相關代碼的其余部分:
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)
並且如果我將兩個構造函數都顯式化,那么該程序實際上有效,但我不確定我是否理解自動轉換會發生什么。 誰能解釋這種行為?
MyMoney + 10
由於沒有operator+(Money, int)
,因此必須在此處進行一些轉換。 編譯器可以將Money
轉換為double
,然后將10轉換為'double'並選擇內置operator+(double,double)
,或者它可以將int
轉換為Money
並選擇operator+(Money,Money)
。
編譯器和Benjamin指出的問題是,有兩個轉換序列導致operator+
overloads的不同有效參數集。 但這實際上表明設計存在更深層次的問題。 應該幾乎不使用隱式轉換,並且從兩種不同類型進行隱式轉換是問題的處方。
考慮使構造函數顯式化,並使轉換運算符也顯式(C ++ 11語言特性),或者刪除它們並提供命名轉換(通過成員函數而不是運算符),如std::string::c_str()
。
任何東西都自動轉化為金錢真的有意義嗎? 那就像變成灰塵一樣容易嗎? 學習讓編譯器通過避免削弱類型系統的隱式轉換來幫助您檢測邏輯問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.