extern template class S<int>;
Я думаю, что эта строка вызывает ошибку, поскольку она указывает компилятору искать явное создание экземпляра из S<int>
, но явного создания не существует. Отсюда и ошибка.
Как только вы прокомментируете эту строку, я думаю, что код должен хорошо скомпилироваться.
EDIT:
Хорошо, посмотрите на это: http://www.ideone.com/oQnOi
Как я уже сказал, он прекрасно компилируется!
EDIT:
Я думаю, что $ 9.4.2 / 4 (как указано Mark B ) не применяется к статическим членам класса templates , как $ 14.5.1.3 [temp.static] не требует, чтобы статические члены определялись в области имен:
Определение статического члена данных
может быть предоставлено в области имен
включая определение статического
шаблон класса участника .
Пример выглядит следующим образом:
template<class T> class X { static T s; };
template<class T> T X<T>::s = 0;
Обратите внимание, в нем не сказано, что "должно быть предоставлено" , скорее, "может быть предоставлено" . Поэтому я думаю, что определение статических членов шаблона класса в области имен пространства является необязательным.