このコードを考えると:
//header.h
template <class T>
class Foo
{
public:
Foo(T t) : t(t) {}
T t;
};
//source1.cpp:
#include "header.h"
extern template class Foo<int>;
int main()
{
Foo<int> f(42);
}
class Foo<int>
私の理解では、どこにも定義がないはずなので、このプログラムはリンクすべきではありません(extern template
これを防ぐ必要があります)。ただし、VC ++ 11(Visual Studio 2012)では、これはコンパイルおよびリンクされます。GCCでは、次のことは行いません。
source1.cpp:(.text+0x15): undefined reference to `Foo<int>::Foo(int)'
ただし、source2.cppとリンクすると、機能します(期待どおり):
#include "header.h"
template class Foo<int>;
このブログ投稿によると、externテンプレートはVC10以降サポートされているはずです。 http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
ちなみに、Windows / Visual Studioのオブジェクトファイルに名前をリストする方法はありますか?Linuxでは次のようにします。
$ nm source1.o
U _ZN3FooIiEC1Ei <- "U" means that this symbol is undefined.
0000000000000000 T main