2013-04-08 68 views
0

今天我遇到了這個奇怪的錯誤,我使用std :: min來獲取變量值的最小值和枚舉常量,到目前爲止,一切都很好,但是當我去編譯它,G ++給我指出它找不到min函數模板匹配編譯錯誤:std :: min無法將枚舉常量解釋爲有效整數類型(g ++ 4.6.3)

no matching function for call to ‘min(int&, main()::<anonymous enum>)’ 

這是再現mimimal例子錯誤:

#include <algorithm> 
int main() 
{ 
    int actualRange=10; 
    enum { DesiredRange=8 }; 
    int workingRange = std::min(actualRange, DesiredRange); 
    return 0; 
} 

修復是微不足道的,我簡單地使用int(DesiredRange)作爲mi的第二個參數n函數,但它讓我感到驚訝,因爲枚舉類型只是一個整數常量,所以這是非常必要的。我的系統信息如下:「g ++(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3」

有沒有什麼不正確的代碼引發了這個錯誤?,這是一個有效的編譯錯誤嗎?,

+0

min的參數必須是相同的類型 – PlasmaHH 2013-04-08 19:54:34

回答

3

你的代碼沒問題。模板參數扣除不做轉換(除了派生到基地),所以你得到這個問題與一個簡單定義的功能,如std::min。 andrei alexandrescu曾經寫過a long treatise關於在C++ 03中需要什麼來創建一個基於min函數的模板作爲類型lenient作爲宏。

+0

IIRC,派生到基地不在類型扣除過程中執行 – 2013-04-08 19:57:31

+0

感謝您的鏈接,我不禁感到有時候這樣的tricky細節作爲對抗C++的作爲工作語言 – 2013-04-08 20:00:15

+0

@AndyProwl:看起來你是對的,所以我修正了這個問題。但那裏有些東西......我只記得一些舊的代碼,現在我需要找出它的真實含義。 ;-) – 2013-04-08 20:02:56

2

你忘記的是std::min僅在一種類型上模板化,並且當你將兩種不同的類型(你的enum和int)傳入它時,編譯器無法弄清楚使用哪種類型,模板類型,因此它會失敗並帶有錯誤的類型推導。

如果你發現比你的int轉換機制更清晰,你可以指定std::min<int>(actualRange, DesiredRange);

相關問題