17

次のコンパイラ¹メッセージが表示されます

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;
}

¹gcc4.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]
4

1 に答える 1

26
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つの警告です。未使用のパラメータについて3行の警告が表示されます。最初の2行は、警告の原因を特定するのに役立つコンパイラーです。これが英語の翻訳です:

5行目7列目で必要とされたwithtemplate引数のインスタンス化では、。という未使用のパラメーターがfktあります。Foointf

fkt関数テンプレートです。テンプレートは、指定されたテンプレート引数を使用してインスタンス化する必要があります。たとえば、を使用する場合fkt<int>fkt関数テンプレートはとしてインスタンス化さFoointます。を使用するfkt<float>と、fkt関数テンプレートはとしてインスタンス化さFoofloatます。

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

fkt(1);

テンプレート引数は、指定する引数のタイプから推測されるため、これはasでインスタンス化fktされます。通過しているので、と推定されます。FoointFoo1Fooint

于 2013-03-26T18:50:06.393 に答える