2

Visual Studio 2010を使用してライブラリを作成する方法を学習しています。したがって、複数のシンボルをテストするために、次のように記述しました。

add.cpp

template <typename T>
T fooBar(T a1, T a2)
{
  return (a1+a2);
}

減算.cpp

template <typename T>
T fooBar(T a1, T a2)
{
  return (a1-a2);
}

私が理解している限り、テンプレートはコンパイル時の概念です。関数/関数テンプレート間でツールがどのように動作するかをテストするために、上記を作成しました。.lib関数テンプレートに設定された最高レベルでも、警告なしで正常に作成されました。ただし、通常の機能の場合は警告が表示されます。

add.obj:警告LNK4006: "int __cdecl fooBar(int、int)"(?fooBar @@ YAHHH @ Z)はsubtract.objですでに定義されています。2番目の定義は無視されます

add.obj:警告LNK4221:パブリックシンボルが見つかりません。アーカイブメンバーにアクセスできなくなります

関数と関数テンプレートでツールの動作が異なるのはなぜですか?

4

1 に答える 1

2

これらはテンプレート化された関数であるため、実際にテンプレート関数をインスタンス化するまで、関数自体はコンパイルされません。

たとえば、次のコードを.cpp使用せずにファイルの1つに入れるだけで、ファイルのコンパイルは.cpp正常に行われました(明白な構文エラーにもかかわらず)。

template <typename J>
int foobar(J junk)
{
#pragma message("Compiling foobar")
     ppp = 35;

     return 0;
}

それは私がそれをコンパイルしようとする(つまりそれのコンパイラインスタンスを作成する)まではありません:

int main(void)
{
     double x;
     int y = foobar(x);
     return 0;
}

コンパイルエラーが発生しますか?

: error C2065: 'ppp' : undeclared identifier  

これを自分で試してみてください。これは、表示されている内容を説明するのに役立つ場合があります(少なくとも、最初に言及したケースではエラーがないこと)。

于 2012-04-24T21:16:24.183 に答える