2014-04-29 70 views
3

,像這樣G ++:默認超載對於給定的兩個功能不明確的情況

inline V2T<Int16> GS(float x, float y, int xOff, int yOff, Uint8 f = 0x00); 
inline V2T<Int16> GS(float x, float y, int xOff, int yOff, int maxW = -1, int maxH = -1, Uint8 f = 0x00); 

超載是像GS(浮球,浮球,INT,INT)案件明顯曖昧

有什麼辦法我可以爲這種情況指定一個默認的重載?除了GNU C++編譯器之外,不必與其他任何軟件兼容,因爲我已經使用了幾個獨特的約定。 理想的情況下,像

inline V2T<Int16> GS(... , Uint8 f = 0x00) __default; 
inline V2T<Int16> GS(... , int maxW = -1, int maxH = -1, Uint8 f = 0x00); 

從而使編譯器支持第一(__default)功能的自動解決。

我見過的所有問題都面向新手,第一次遇到這個錯誤,所以有可能這個答案已經被解決了。提前致謝!

+0

正如你所說,定義是明顯含糊不清。默認超載是什麼意思?給GS(float,float,int,int),你想調用哪兩個函數? –

+0

編輯(希望)使問題更清晰,現在更有意義嗎? – Precursor

回答

5

試試這個

inline V2T<Int16> GS(float x, float y, int xOff, int yOff, Uint8 f = 0x00); 

// this one is not default one 
template <class = void> 
inline V2T<Int16> GS(float x, float y, int xOff, int yOff, int maxW = -1, int maxH = -1, Uint8 f = 0x00); 

你可以看到導致here

+0

你是救命的伴侶,它的工作原理! ...雖然我必須承認,我不是有點好奇/爲什麼/ – Precursor

+1

它是與功能解析順序有關的東西。編譯器在嘗試模板之前先選擇超載。 –

+0

如果所有其他條件都相同,則非模板優先於模板,但我不會這樣做。 Hurkyl的答案不那麼浮華,但更接近你所要求的,並且更容易理解你和其他維護者。 –

3

最明顯的解決方法是

inline V2T<Int16> GS(float x, float y, int xOff, int yOff, Uint8 f = 0x00); 
inline V2T<Int16> GS(float x, float y, int xOff, int yOff, int maxW, int maxH = -1, Uint8 f = 0x00); 

因爲你的意圖是,maxW實際上不能給出一個默認值。

+0

我考慮過這個問題,但是這樣的修復需要重寫這個函數的四十多個用法,而且我必須處理與由Uint8 - > int創建的不明確性沒有明確的轉換。 – Precursor

+0

@Precursor:這將如何要求用戶重寫?如果你想使用其他重載的默認值,那麼從* never *函數中刪除默認重載作爲具有4個參數的最佳候選者不需要重寫 –

+1

不知道實際上下文,我最好的猜測是你是試圖做一些相當危險的事情,並試圖對(合法的)編譯器投訴進行緊急修復。你真的確定你想要做的事實際上是一個好主意嗎? – Hurkyl

相關問題