шаблон класса специальная функция-член явная специализация

В 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)

В чем причина таких ограничений?

1

Решение

Это согласуется с тем, как обычно работают определения функций-членов. Вы можете только определить функции, которые вы объявили первыми. Например, это не скомпилируется:

struct B {
};

B::B() {
}

Конструктор неявно объявлен, и поэтому не может быть явно определен.

В абзаце, который вы цитировали, сказано, что это работает так же и для шаблонных специализаций.

3

Другие решения


По вопросам рекламы [email protected]