什么是“在实例化...需要从这里“的意思



我收到以下编译器¹消息

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函数模板实例化时Fooint 。如果使用 fkt<float> ,则fkt函数模板将实例化为 Foo 作为float

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

fkt(1);

这是实例化fkt Foo作为int,因为模板参数Foo是从您给出的参数类型推断出来的。既然你通过1Foo就被推论为int

最新更新