2013-03-26 11 views
12

ottengo il seguente messaggio compiler¹Che cosa significa "In instantiation of ... required from here"?

main.cpp: In instantiation of ‘void fkt(Foo) [with Foo = int]’: 
main.cpp:5:7: required from here 

Il binario viene creato in ogni caso, quindi non è un errore. Ma è anche non contrassegnato come un avvertimento. Qual è questo messaggio e perché lo ricevo?

ho ridotto il codice nel seguente esempio

template <typename Foo> 
void fkt(Foo f) {} 

int main() { 
    fkt(1); 
    return 0; 
} 

¹ gcc 4.7.2

EDIT: Qui i passaggi per riprodurre:

% 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

È * parte * di un errore. Hai perso alcuni messaggi circostanti. –

+0

Penso che hai rimosso l'errore quando hai ridotto il codice. Vedi [qui] (http://ideone.com/qx5yxF). Si prega di provare fornendo un esempio che riproduce l'errore. – juanchopanza

+0

Il codice nella domanda è valido e deve essere compilato senza errori/avvisi. Il messaggio che stai indicando fa parte di un messaggio più grande, la/e riga/e precedente conteneva un avviso/errore e questo continua a spiegare come il compilatore è entrato in quell'avvertimento/errore –

risposta

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] 

Questo è tutto un warni ng. Stai ricevendo un avviso di 3 righe su un parametro non utilizzato. Le prime due righe sono il compilatore che tenta di aiutarti a identificare la causa dell'avvertimento. Ecco una traduzione in inglese:

Nella istanza di fkt con argomento di un template Foo come int che è stato richiesto dalla linea 5 colonna 7, si ha un parametro chiamato inutilizzato f.

fkt è un modello di funzione. I template devono essere istanziati con gli argomenti template specificati. Ad esempio, se si utilizza fkt<int>, il modello di funzione fkt viene istanziato con Foo come int. Se si utilizza fkt<float>, il modello di funzione fkt viene creato un'istanza con Foo come float.

In particolare, questa prima riga di questo messaggio indica che l'avviso si verifica all'interno di fkt che è stato istanziato con Foo come int. La seconda linea di avvertimento ti dice che di istanza si è verificato sulla linea 5. Che corrisponde a questa linea:

fkt(1); 

Questo è istanziare fkt con Foo come int perché l'argomento modello Foo viene dedotto dal tipo dell'argomento stai dando. Dal momento che stai passando 1, Foo viene dedotto per essere int.

+0

Quindi, in realtà il mio codice è corretto al 100% e non ci sono errori e posso ignorare questo messaggio per quanto ho capito. – Marco

+0

@Marco Sì, va bene. Tranne il parametro non utilizzato. –

+0

È possibile ignorare gli avvisi e questo è un avviso. Comunque non dovresti. Ci sono altre e migliori possibilità. Lascia che il compilatore ignori i parametri inutilizzati ('-Wno-unused-parameter'), o usa il parametro, o non specificare un nome per esso (che dice esplicitamente al compilatore che non lo userai) o gettandolo annullare, un modo alternativo comune per dire al compilatore che non lo si utilizzerà ('(void) f;' come prima riga della funzione). – leemes