Есть ли ошибка в шаблоне extern в Visual C ++?

Учитывая этот код:

//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. 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

Ответы на вопрос(1)

Ваш ответ на вопрос