[英]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 ++編碼標准 :
- 考慮重載以避免隱式類型轉換。
不要在不必要的情況下繁殖對象(Occam的Razor):隱式類型轉換提供了語法上的便利(但請參見第40項)。 但是,當不需要創建臨時對象並且進行適當的優化時(請參見條款8),可以為重載函數提供簽名,這些簽名與普通參數類型完全匹配,並且不會引起轉換。
並非所有的變化都是進步:隱性轉換通常造成的弊大於利。 在提供與您定義的類型之間的隱式轉換之前,請三思而后行,並且更喜歡依靠顯式轉換(顯式構造函數和命名轉換函數)。
其中很多涉及提供隱式轉換可能導致的效率和意外行為,但是在提供隱式轉換運算符和/或構造函數時,您很容易會遇到副作用,其中包括函數重載引起的歧義錯誤。
解決方案:讓您的操作員明確或完全避免提供它。 這可能很方便,但它可能會引起這樣的麻煩(編譯器錯誤實際上是最討厭的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.