次のコードをコンパイルすると、次のようになります。
//
// g++ static.cpp -o static.o
// ar rcs libstatic.a static.o
//
#include <iostream>
template < typename T >
struct TemplatedClass
{
void Test( T value )
{
std::cout << "Foobar was: " << value << std::endl;
}
};
template struct TemplatedClass < long >;
静的ライブラリを取得し、ライブラリでnmを実行すると、次の結果が得られます。
testcase% nm libstatic.a | c++filt | grep TemplatedClass
0000000000000207 s global constructors keyed to _ZN14TemplatedClassIlE4TestEl
0000000000000300 s global constructors keyed to _ZN14TemplatedClassIlE4TestEl.eh
0000000000000118 T TemplatedClass<long>::Test(long)
00000000000002a0 S __ZN14TemplatedClassIlE4TestEl.eh
ただし、次のコードをコンパイルすると、テンプレートクラスの明示的な特殊化を追加したことを除いて同じです...
//
// g++ static.cpp -o static.o
// ar rcs libstatic.a static.o
//
#include <iostream>
template < typename T >
struct TemplatedClass
{
void Test( T value )
{
std::cout << "Foobar was: " << value << std::endl;
}
};
template <>
struct TemplatedClass < long >
{
void Test( long value )
{
std::cout << "Value was: " << value << std::endl;
}
};
template struct TemplatedClass < long >;
...そして同じコマンドを再実行します:
testcase% nm libstatic.a | c++filt| grep TemplatedClass
testcase%
一致する記号がありません。どういうわけか、私が明示的に要求したにもかかわらず、コンパイラーはテンプレートをインスタンス化しません。
誰かがここで何が起こっているのか私に説明できますか?