鑑於這種代碼:在Visual C++中是否存在extern模板的錯誤?
//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),這不會編譯和鏈接。在海灣合作委員會,它不:
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
啊,inlinin克,我沒有想到這一點。這解釋了它。 – knatten