2014-04-04 72 views
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)' 

回答

1

用C++ 11你可以標記類型轉換運算符operator int() {...}explicit(見here)。

因此,您必須使用C++ 11和顯式轉換,或忘記這些類型轉換運算符。

順便說一句,在C++ 11也有user-defined literals

MyType operator"" _mytype (unsigned long long n) { 
    return MyType{n}; 
} 

有了這個,你可以這樣寫:

if(mycustomtype > 5_mytype) { ... } 
+0

不幸的是,我使用VS2012,並沒有出現明確的支持運營商。公司標準仍然是VS2012,所以升級不是一種選擇。 謝謝你的答案:)我不知道運營商可能是明確的。 C++ 11中有很多好東西! – qeadz

+0

在提出這個問題之前和之後都進行了一些非常詳盡的搜索之後,似乎這個捍衛者是正確的。使類型轉換運算符明確似乎是唯一的方法。我想我應該放棄對它們的支持,直到我們使用能夠做到這一點的編譯器。 感謝您的幫助。 – qeadz