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

时间:2013-03-26 18:41:33

标签: c++ templates

我收到以下编译器¹消息

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]

1 个答案:

答案 0 :(得分:22)

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的实例化中,模板参数Fooint,这是第5行第7列所要求的,您有一个名为f的未使用参数。

fkt是一个功能模板。必须使用给定的模板参数实例化模板。例如,如果您使用fkt<int>fkt函数模板将Foo实例化为int。如果您使用fkt<float>fkt功能模板将Foo实例化为float

特别是,此消息的第一行告诉您警告发生在fkt内,Foo实例化为int fkt(1); 。警告的第二行告诉您实例化发生在第5行。这对应于这一行:

fkt

这是将Fooint实例化为Foo,因为模板参数1是从您提供的参数类型中推断出来的。由于您传递了Fooint被推断为{{1}}。