специализация шаблона участника

template<typename T>
class C
{
void f() { }
};

/*template<typename T>
void C<T*>::f() { }*/

template<>
void C<int*>::f() { }

Если мы удалим комментарий, код не скомпилируется. Я знаю это (и я также знаю, что мы должны иметь partial specialization за C<T*>), но я не могу найти слова в стандарте, который объясняет такое поведение. Я перечитала 14 par стандартных несколько раз. Можете ли вы дать мне цитату или стандарт, который объясняет это?

РЕДАКТИРОВАТЬ.

template<typename T>
class C
{
template<typename U>
struct S { };
};
// #1
/*template<typename T>
class C<T*>
{
template<typename U>
struct S { };
};*/
// #2
/*template<typename T>
template<typename U>
struct C<T*>::S<U*> { };*/

template<>
template<typename U>
struct C<int*>::S<U*> { };

Если мы удалим только комментарий, то # 2 — код не скомпилируется.

1

Решение

Вот стандартная цитата о том, что может быть специализированным expliclitly, от 14.7.3 / 1:

Явная специализация любого из следующего:

— шаблон функции

— шаблон класса

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

— статический член данных шаблона класса

— член класса шаблона класса

— перечисление членов шаблона класса

— шаблон класса члена класса или шаблон класса

— шаблон функции-члена класса или шаблон класса

может быть объявлено декларацией template<>;

Если явно не разрешено, вы не можете частично специализировать что-либо, а функции-члены шаблонов классов явно не разрешены. Только шаблоны классов могут быть частично специализированы (как описано в 14.5.5).

(Обратите внимание, что шаблон класса-члена явно специализированного шаблона класса сам по себе является шаблоном класса.)

1

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

Других решений пока нет …

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