Подтвердить что ты не робот

Что означает "При создании... требуемого отсюда"?

Я получаю следующее сообщение компилятора¹

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]
4b9b3361

Ответ 1

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]

Это все одно предупреждение. Вы получаете предупреждение из трех строк о неиспользуемом параметре. Первые две строки - это компилятор, который пытается помочь вам определить причину предупреждения. Здесь английский перевод:

В экземпляре fkt с аргументом шаблона Foo как int, который требовался столбцом строки 5, у вас есть неиспользуемый параметр с именем 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.