我收到以下编译器¹消息
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;
}
¹ 海湾合作委员会 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 行警告。前两行是编译器,试图帮助您确定警告的原因。以下是英文翻译:
在实例化带有模板参数的
fkt
Foo
为第 5 行第 7 列所需的int
时,您有一个名为f
的未使用参数。
fkt
是一个函数模板。模板必须使用给定的模板参数进行实例化。例如,如果使用 fkt<int>
,则fkt
函数模板实例化时Foo
为 int
。如果使用 fkt<float>
,则fkt
函数模板将实例化为 Foo
作为float
。
特别是,此消息的第一行告诉您警告发生在fkt
内部,该警告已实例化Foo
作为int
。警告的第二行告诉您实例化发生在第 5 行。这对应于这一行:
fkt(1);
这是实例化fkt
Foo
作为int
,因为模板参数Foo
是从您给出的参数类型推断出来的。既然你通过1
,Foo
就被推论为int
。