Gibt es einen Fehler mit externer Vorlage in Visual C ++?
Gegeben diesen Code:
//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);
}
Nach meinem Verständnis sollte dieses Programm nicht verknüpfen, da es keine Definition von geben sollteclass Foo<int>
irgendwo (extern template
sollte dies verhindern). Mit VC ++ 11 (Visual Studio 2012) wird dies jedoch kompiliert und verknüpft. In GCC gilt Folgendes nicht:
source1.cpp:(.text+0x15): undefined reference to `Foo<int>::Foo(int)'
Wenn ich mich jedoch mit source2.cpp verbinde, funktioniert es (wie ich es erwartet habe):
#include "header.h"
template class Foo<int>;
Laut diesem Blogbeitrag sollte das externe Template seit VC10 unterstützt werden.http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
Gibt es eine Möglichkeit, die Namen in einer Objektdatei unter Windows / Visual Studio aufzulisten? Unter Linux würde ich Folgendes tun:
$ nm source1.o
U _ZN3FooIiEC1Ei <- "U" means that this symbol is undefined.
0000000000000000 T main