什么"实例化......从这里需要"是什么意思?

Mar*_*rco 15 c++ templates

我收到以下编译器¹消息

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

无论如何都会创建二进制文件,所以这不是错误.但它也没有被标记为警告.这是什么信息,为什么我会得到它?

我将代码缩减为以下示例

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

int main() {
  fkt(1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

¹ 的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]
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 23

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]
Run Code Online (Sandbox Code Playgroud)

这是一个警告.您收到有关未使用参数的3行警告.前两行是编译器试图帮助您确定警告的原因.这是一个英文翻译:

在实例化fkt与模板参数Foo作为int其要求的行5列7,你有一个名为未使用的参数f.

fkt是一个功能模板.必须使用给定的模板参数实例化模板.例如,如果使用fkt<int>,fkt则使用Fooas 实例化函数模板int.如果使用fkt<float>,fkt则使用Fooas 实例化函数模板float.

特别是,此消息的第一行告诉您警告发生在fkt其中用Fooas 实例化int.警告的第二行告诉您实例化发生在第5行.这对应于此行:

fkt(1);
Run Code Online (Sandbox Code Playgroud)

这是fktFooas 实例化的,int因为模板参数Foo是从你给出的参数类型中推导出来的.自从你通过1,Foo被推断为int.