簡體   English   中英

C ++轉換運算符錯誤?

[英]C++ conversion operator error?

在類聲明中重載的運算符:

class Asdf{

    operator float() const;                 
    Asdf operator+(const Asdf&) const;
    Asdf operator+(float);

}

int main()

{
    Asdf object1, object2, object3;

    //Receiving error: "more than one operator '+' matches these operands"
    object1= object2 + object3;

    _getch();
    return 0;
}

錯誤:

:error C2666: 'Asdf::operator +' : 3 overloads have similar conversions

   :could be 'Asdf Asdf::operator +(float)'

   :'Asdf Asdf::operator +(const Asdf &) const'

當我刪除所有與重載float轉換運算符一起使用的轉換時,代碼將正確編譯。

之所以發生這種情況,是因為轉換運算符提供了從您的類到float的隱式方法。 因此,其他涉及浮點數的加法運算符會妨礙您的操作。

為了解決這個問題,如果您真的希望進行這種轉換,最好的解決方案是將其明確標記為:

explicit operator float() const;

Asdf a;
float f = static_cast<float>(a);

但是,這僅在C ++ 11中有效。 在C ++ 03中,更好的選擇是改為使用函數:

float toFloat() const;

Asdf a;
float f = a.toFloat();

隱式轉換運算符往往會引起此類歧義,尤其是與隱式構造函數結合使用時。

根據C ++編碼標准

  1. 考慮重載以避免隱式類型轉換。

不要在不必要的情況下繁殖對象(Occam的Razor):隱式類型轉換提供了語法上的便利(但請參見第40項)。 但是,當不需要創建臨時對象並且進行適當的優化時(請參見條款8),可以為重載函數提供簽名,這些簽名與普通參數類型完全匹配,並且不會引起轉換。

並非所有的變化都是進步:隱性轉換通常造成的弊大於利。 在提供與您定義的類型之間的隱式轉換之前,請三思而后行,並且更喜歡依靠顯式轉換(顯式構造函數和命名轉換函數)。

其中很多涉及提供隱式轉換可能導致的效率和意外行為,但是在提供隱式轉換運算符和/或構造函數時,您很容易會遇到副作用,其中包括函數重載引起的歧義錯誤。

解決方案:讓您的操作員明確或完全避免提供它。 這可能很方便,但它可能會引起這樣的麻煩(編譯器錯誤實際上是最討厭的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM