鉴于此代码:
//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>;
根据这篇博文,从 VC10 开始应该支持 extern 模板。 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