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 — код не скомпилируется.
Вот стандартная цитата о том, что может быть специализированным expliclitly, от 14.7.3 / 1:
Явная специализация любого из следующего:
— шаблон функции
— шаблон класса
— функция-член шаблона класса
— статический член данных шаблона класса
— член класса шаблона класса
— перечисление членов шаблона класса
— шаблон класса члена класса или шаблон класса
— шаблон функции-члена класса или шаблон класса
может быть объявлено декларацией
template<>;
Если явно не разрешено, вы не можете частично специализировать что-либо, а функции-члены шаблонов классов явно не разрешены. Только шаблоны классов могут быть частично специализированы (как описано в 14.5.5).
(Обратите внимание, что шаблон класса-члена явно специализированного шаблона класса сам по себе является шаблоном класса.)
Других решений пока нет …