Existe um bug com o modelo externo no Visual C ++?
Dado este código:
//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);
}
Pelo que entendi, este programa não deve vincular, pois não deve haver definição declass Foo<int>
qualquer lugar (extern template
deve evitar isso). Com o VC ++ 11 (Visual Studio 2012), isso compila e vincula. No GCC, isso não acontece:
source1.cpp:(.text+0x15): undefined reference to `Foo<int>::Foo(int)'
Se eu ligar com o source2.cpp, no entanto, funciona (como eu esperava que deveria):
#include "header.h"
template class Foo<int>;
De acordo com este post do blog, o template externo deveria ter sido suportado desde o VC10.http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
Em uma nota lateral, existe uma maneira de listar os nomes em um arquivo de objeto no Windows / Visual Studio? No Linux eu faria:
$ nm source1.o
U _ZN3FooIiEC1Ei <- "U" means that this symbol is undefined.
0000000000000000 T main