2011-01-23 62 views
1

我剛剛花了幾個小時調試編譯器錯誤,如果編譯器的錯誤消息更有幫助,我可以立即修復這個錯誤。無益(可能是錯誤的?)gcc錯誤消息

我它減少到一個簡單的例子:

template <typename T> 
int f(int); 

template <typename U> 
auto g(U x) -> decltype(f(x)); 

int main() 
{ 
    g(0); 
} 

的錯誤是:

test.cpp: In function 'int main()': 
test.cpp:9:8: error: no matching function for call to 'g(int)' 
test.cpp:9:8: note: candidate is: 
test.cpp:5:29: note: template<class U> decltype (f(x)) g(U) 

這個錯誤是不是充其量誤導,在最壞的情況,完全錯了嗎?我的看法是,問題是而不是 g的給定定義與調用不匹配,但該定義格式錯誤(因爲在decltype中的表達式f(x)中,它會嘗試調用f沒有指定f的模板參數)。

難道一個更加合理的錯誤信息是這樣的:

no matching function for call to 'f(int)' in 'decltype(f(x))' 
in instantiation of 'g(U)' with U = int 

甚至更​​好:

failed to deduce template parameter 1 in call to 'f(int)' in 'decltype(f(x))' 
in instantiation of 'g(U)' with U = int 

我本來期望類似的東西...

+0

哪個GCC的版本在哪個平臺產生的誤差?這是一個G ++擴展還是新的C++ 0x語法?鑑於使用`auto`,我認爲後者。 – 2011-01-23 03:59:56

+0

@Jonathan:decltype和後期指定的返回類型是C++ 0x(因此這個問題的C++ 0x標籤)的新增內容。自(至少)版本4.4以來,它們一直由gcc支持。我引用的錯誤是由gcc 4.6的實驗版本產生的,但4.4和4.5給出了類似的錯誤。 – HighCommander4 2011-01-23 04:04:28

回答

1

你最有可能在C++ 0x中觸發「擴展的SFINAE」規則;由於f(x)的呼叫在返回類型g的實例化中不起作用(因爲無法對f的呼叫推導出T),因此g具有無效的返回類型,因此將以無提示的方式從超載集中移除。儘管它對錯誤消息質量有害,但這是一個功能,因爲編譯器假定g是一個不相關的函數,您不打算調用它。在這種情況下,g沒有其他重載,所以編譯器應該給出更好的消息。

有更多關於擴展SFINAE的信息可在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html

1

鏗鏘我得到這個錯誤

C:\Users\SUPER USER\Desktop>clang++ -cc1 -std=c++0x aa.cpp 
aa.cpp:9:5: error: no matching function for call to 'g' 
    g(0); 
    ^
aa.cpp:5:6: note: candidate template ignored: substitution failure [with U = int 
] 
auto g(U x) -> decltype(f(x)){} 
    ^
1 error generated. 

更容易理解比G ++