В c ++ iso 2003/2011 [temp.expl.spec] / 4 написано, что
Функция-член, класс-член или статический член-данные шаблона класса могут быть явно специализированы для специализации класса, которая неявно создается; в этом случае определение шаблона класса должно находиться в области действия в точке объявления явной специализации для члена шаблона класса. Если такая явная специализация для члена шаблона класса называет неявно объявленную специальную функцию-член (пункт 12), программа является плохо сформированной.
Поэтому, как я понимаю, специальные функции, которые должны быть разрешены для специализации, должны быть определены до явной специализации.
template <typename T>
class A
{
public:
A()
{ /* some definition */}
};
template <>
A<int>::A()
{ /*explicit specialization def body*/} // this is OK
но
template <typename T>
class B
{};
template <>
B<int>::B()
{ /*explicit specializationdef body */} // this is forbidden by ISO c++
// and when compiling with VS2013 gives compile error
// cannot define a compiler-generated special member
// function (must be declared in the class first)
В чем причина таких ограничений?
Это согласуется с тем, как обычно работают определения функций-членов. Вы можете только определить функции, которые вы объявили первыми. Например, это не скомпилируется:
struct B {
};
B::B() {
}
Конструктор неявно объявлен, и поэтому не может быть явно определен.
В абзаце, который вы цитировали, сказано, что это работает так же и для шаблонных специализаций.