我收到以下编译器¹消息

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行警告。前两行是编译器试图帮助您确定警告原因的原因。这是英文翻译:


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

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

这是使用fkt作为Foo实例化int的原因,因为模板参数Foo是从您提供的参数类型中推导出来的。由于您传递的是1,因此Foo被推导为int

关于c++ - “In instantiation of … required from here”是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15644938/

10-13 08:16