2013-03-26 39 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