2013-03-26 2 views
12

я получаю следующее сообщение compiler¹Что означает «При создании ... требуется отсюда»?

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

EDIT: Вот шаги для воспроизведения:

% 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] 
+3

Это * часть * погрешности. Вы пропустили некоторые окружающие сообщения. –

+0

Я думаю, что вы удалили ошибку, когда вы сократили код. См. [Здесь] (http://ideone.com/qx5yxF). Попробуйте привести пример, который воспроизводит ошибку. – juanchopanza

+0

Код в вопросе действителен и должен компилироваться без ошибок/предупреждений. Сообщение, которое вы указываете, является частью более крупного сообщения, в предыдущей строке содержалось предупреждение/ошибка, и это продолжается, объясняя, как компилятор включил это предупреждение/ошибку. –

ответ

20
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 колонки 7, у вас есть неиспользуемый параметр, который называется 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.

+0

Итак, на самом деле мой код на 100% правильный, и нет ошибки, и я могу игнорировать это сообщение, насколько я понимаю. – Marco

+0

@ Марко Да, все в порядке. За исключением неиспользуемого параметра. –

+0

Вы можете игнорировать предупреждения, и это предупреждение. Однако вы не должны. Есть и другие и лучшие возможности. Или пусть компилятор игнорирует неиспользуемые параметры ('-Wno-unused-parameter') или использует этот параметр, или не указывать имя для него (которое явно говорит о компиляторе, что вы его не используете) или путем его литья to void, обычный альтернативный способ сообщить компилятору, что вы не собираетесь его использовать ('(void) f;' как первая строка функции). – leemes

Смежные вопросы