¿Hay un error con la plantilla externa en 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);
}

Según tengo entendido, este programa no debería vincularse, ya que no debería haber una definición declass Foo<int> en cualquier sitio (extern template debe evitar esto). Con VC ++ 11 (Visual Studio 2012), esto sí compila y enlaza. En GCC, no lo hace:

source1.cpp:(.text+0x15): undefined reference to `Foo<int>::Foo(int)'

Sin embargo, si me vinculo con source2.cpp, funciona (como creo que debería):

#include "header.h"
template class Foo<int>;

De acuerdo con esta publicación de blog, la plantilla externa debería haber sido compatible desde VC10.http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10/10209291.aspx

En una nota al margen, ¿hay una manera de enumerar los nombres en un archivo objeto en Windows / Visual Studio? En Linux haría:

$ nm source1.o
U _ZN3FooIiEC1Ei      <- "U" means that this symbol is undefined.
0000000000000000 T main

Respuestas a la pregunta(1)

Su respuesta a la pregunta