1
我正在創建一個自定義類型。理想情況下,它將盡可能與基本類型互換。爲此,我重載了類中的所有操作符,並提供了一個模板化的構造函數來接受所有基本類型。混合類型的評估總是促進我的自定義類型。自定義類型,類型轉換使操作符發生衝突?
auto result = 5/mycustomtype * 2.0f; // result is of type MyCustomType
現在,我已經提供的實現爲整數,浮點和雙運營商。理想情況下,類型轉換應該像用戶預期的那樣適用於任何類型。
這是除了已經把我在一個奇怪的斑點類型轉換操作符:
隨着代碼:
if (mycustomtype > 5) { ... }
編譯器看到很多可能性,包括下面的例子:
if (mycustomtype > MyCustomType(5)) { ... }
或
if ((int)mycustomtype > 5) { ... }
因此,它會給我一個錯誤,它可以轉換爲每種可能的類型組合。我明白爲什麼它有所有這些選項,但我堅持如何解決這個問題。最簡單的辦法就是不支持類型轉換以這種方式和而提供類似的接口:
auto f = mycustomtype.As<float>()
但是這將是非常整齊,如果我可以有我的魚和熊掌兼得。
PS:例如錯誤輸出 -
c:\...\MyType.cpp(106): error C2666: 'MyType< template params >::operator >=' : 4 overloads have similar conversions
with
[
template specializations...
]
c:\...\MyType.h(63): could be 'bool MyType<...>::operator >=(const MyType<...> &) const'
with
[
template specializations...
]
or 'built-in C++ operator>=(float, double)'
or 'built-in C++ operator>=(int, double)'
or 'built-in C++ operator>=(double, double)'
while trying to match the argument list '(MyType, double)'
不幸的是,我使用VS2012,並沒有出現明確的支持運營商。公司標準仍然是VS2012,所以升級不是一種選擇。 謝謝你的答案:)我不知道運營商可能是明確的。 C++ 11中有很多好東西! – qeadz
在提出這個問題之前和之後都進行了一些非常詳盡的搜索之後,似乎這個捍衛者是正確的。使類型轉換運算符明確似乎是唯一的方法。我想我應該放棄對它們的支持,直到我們使用能夠做到這一點的編譯器。 感謝您的幫助。 – qeadz