我得到以下编译器¹消息
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]
解决方法
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行警告.前两行是编译器尝试帮助您识别警告的原因.这是一个英文翻译:
In the instantiation of
fkt
with template argumentFoo
asint
which was required by line 5 column 7,you have an unused parameter calledf
.
fkt是一个函数模板.必须使用给定的模板参数实例化模板.例如,如果使用fkt< int>,fkt函数模板将以Foo作为int进行实例化.如果使用fkt< float>,fkt函数模板将以Foo作为浮点实例化.
特别是,这条消息的第一行告诉你,fkt内部的警告发生在Foo中,以Foo为例.警告的第二行告诉您,第5行发生了实例化.对应于此行:
fkt(1);
这是Foo作为int实例化的fkt,因为模板参数Foo是从你给出的参数的类型推导出来的.由于你过了1,Foo被推断为int.