次のファイルを検討してください。
フー.H
template <typename T>
struct Foo
{
int foo();
};
template <typename T>
int Foo<T>::foo()
{
return 6;
}
Foo.C
#include "Foo.H"
template <>
int Foo<int>::foo()
{
return 7;
}
main.C
#include <iostream>
#include "Foo.H"
using namespace std;
int main()
{
Foo<int> f;
cout << f.foo() << endl;
return 0;
}
コンパイルして実行すると、7 が出力されます。何が起きてる?テンプレートはいつインスタンス化されますか? コンパイラがそれを行う場合、コンパイラは独自のバージョンの Foo をインスタンス化しないことをどのように知るのでしょうか?