2013-03-26 77 views
12

我得到以下compiler¹消息「在這裏需要實例化」是什麼意思?

main.cpp: In instantiation of ‘void fkt(Foo) [with Foo = int]’: 
main.cpp:5:7: required from here 

無論如何創建的二進制文件,所以它不是一個錯誤。但它也是 未標記爲警告。這條消息是什麼,爲什麼我得到它?

我的代碼減少到下面的例子

template <typename Foo> 
void fkt(Foo f) {} 

int main() { 
    fkt(1); 
    return 0; 
} 

¹ GCC 4.7.2

編輯:這裏重現步驟:

% cat main.cpp 
template <typename Foo> 
void fkt(Foo f) {} 

int main() { 
    fkt(1); 
    return 0; 
} 
% g++ -Wall -Wextra main.cpp 
main.cpp: In instantiation of ‘void fkt(Foo) [with Foo = int]’: 
main.cpp:5:7: required from here 
main.cpp:2:6: warning: unused parameter ‘f’ [-Wunused-parameter] 
+3

它是錯誤的*部分*。你錯過了一些周圍的消息。 – 2013-03-26 18:43:51

+0

我想你在減少代碼時刪除了錯誤。見[這裏](http://ideone.com/qx5yxF)。請嘗試提供一個重現錯誤的例子。 – juanchopanza 2013-03-26 18:43:57

+0

問題中的代碼是有效的,應該編譯時沒有錯誤/警告。您正在指向的消息是更大的消息的一部分,前面的行包含警告/錯誤,並繼續解釋編譯器如何進入該警告/錯誤 – 2013-03-26 18:46:18

回答

20
main.cpp: In instantiation of ‘void fkt(Foo) [with Foo = int]’: 
main.cpp:5:7: required from here 
main.cpp:2:6: warning: unused parameter ‘f’ [-Wunused-parameter] 

這都是一場戰爭NG。您將收到一條關於未使用參數的3行警告。前兩行是編譯器試圖幫助您確定警告的原因。這裏的英文翻譯:

fkt的實例與模板參數Fooint這是要求5行7列中有一個名爲f一個未使用的參數。

fkt是一個函數模板。模板必須用給定的模板參數實例化。例如,如果使用fkt<int>,則fkt函數模板將以Foo實例化爲int。如果您使用fkt<float>fkt功能模板將作爲floatFoo實例化。

特別地,該消息的這個第一行告訴您警告內部fkt其用Foo實例化爲int發生。該警告的第二行告訴你發生第5行對應於這一行實例:因爲模板參數Foo正在從參數的類型推斷

fkt(1); 

這與Foo實例fktint你在給。由於您通過1Foo被推斷爲int

+0

所以,實際上我的代碼是100%正確的,沒有錯誤,據我瞭解,我可以忽略此消息。 – Marco 2013-03-26 18:56:31

+0

@Marco是的,沒關係。除了未使用的參數。 – 2013-03-26 18:57:14

+0

你可以忽略警告,這是一個警告。但是你不應該。還有其他更好的可能性。或者讓編譯器忽略不使用的參數('-Wno-unused-parameter'),或者使用參數,或者不要爲它指定一個名稱(明確表示編譯器不會使用它)或者通過轉換它以一種通用的替代方式告訴編譯器你不會使用它('(void)f;'作爲函數的第一行)。 – leemes 2013-03-26 18:58:26