2013-03-26 6 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

私はあなたがコードを減らしたときにエラーを削除したと思います。 [here](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] 

をこれはすべて1つの警告ですng。未使用のパラメータについて3行の警告が表示されています。最初の2行は、警告の原因を特定するためのコンパイラです。

fktのインスタンス化はテンプレート引数を持つ行5列7によって要求されたintとしてFooは、あなたがfと呼ばれる未使用のパラメータを持っている:ここでは英語の翻訳です。

fktは、機能テンプレートです。テンプレートは、指定されたテンプレート引数でインスタンス化する必要があります。たとえば、fkt<int>を使用する場合、fktファンクションテンプレートはFooとしてインスタンス化され、intとなります。 fkt<float>を使用する場合、fktファンクションテンプレートは、Fooでインスタンス化され、floatとなります。

特に、Fooでインスタンス化されたfktの内部で警告が発生することをこのメッセージの最初の行に示します。int。警告の2行目は、インスタンス化がこの行に対応する行5に発生したことを示しています:

fkt(1); 

テンプレート引数Fooは、引数の型から推定されているので、これはintとしてFoofktをインスタンス化していますあなたは与えている。 1を渡すので、Foointであると推定されます。

+0

実際、私のコードは100%正解でエラーはなく、私が理解する限り、このメッセージは無視できます。 – Marco

+0

@マルコはい、いいです。未使用のパラメータを除きます。 –

+0

警告は無視できますが、これは警告です。しかし、あなたはしないでください。他にもより良い可能性があります。コンパイラに未使用のパラメータ( '-Wno-unused-parameter')を無視させるか、パラメータを使用するか、または名前を指定しないでください(明示的に使用しないことをコンパイラに指示します)。 ( '(void)f;')を関数の最初の行として使用しないことをコンパイラに伝えるための一般的な方法です。 – leemes

関連する問題