17 Templates [temp]

17.5 Template declarations [temp.decls]

17.5.5 Class template partial specializations [temp.class.spec]

17.5.5.3 Members of class template specializations [temp.class.spec.mfunc]

Список параметров шаблона члена частичной специализации шаблона класса должен соответствовать списку параметров шаблона частичной специализации шаблона класса. Список аргументов шаблона члена частичной специализации шаблона класса должен соответствовать списку аргументов шаблона частичной специализации шаблона класса. Специализация шаблона класса - это отдельный шаблон. Члены частичной специализации шаблона класса не связаны с членами первичного шаблона. Должны быть определены элементы частичной специализации шаблона класса, которые используются способом, требующим определения; определения членов первичного шаблона никогда не используются в качестве определений для членов частичной специализации шаблона класса. Явная специализация члена частичной специализации шаблона класса объявляется так же, как явная специализация первичного шаблона. [Example:

// primary class template
template<class T, int I> struct A {
  void f();
};

// member of primary class template
template<class T, int I> void A<T,I>::f() { }

// class template partial specialization
template<class T> struct A<T,2> {
  void f();
  void g();
  void h();
};

// member of class template partial specialization
template<class T> void A<T,2>::g() { }

// explicit specialization
template<> void A<char,2>::h() { }

int main() {
  A<char,0> a0;
  A<char,2> a2;
  a0.f();           // OK, uses definition of primary template's member
  a2.g();           // OK, uses definition of partial specialization's member
  a2.h();           // OK, uses definition of explicit specialization's member
  a2.f();           // ill-formed, no definition of f for A<T,2>; the primary template is not used here
}

end example]

Если шаблон элемента шаблона класса является частично специализированным, частичные специализации шаблона элемента являются шаблонами элементов включающего шаблона класса; если создается экземпляр шаблона включающего класса ([temp.inst], [temp.explicit]), объявление для каждой частичной специализации шаблона элемента также создается как часть создания членов специализации шаблона класса. Если первичный шаблон члена явно специализирован для данной (неявной) специализации шаблона включающего класса, частичные специализации шаблона члена игнорируются для этой специализации шаблона включающего класса. Если частичная специализация шаблона члена явно специализирована для данной (неявной) специализации шаблона включающего класса, основной шаблон члена и другие его частичные специализации по-прежнему рассматриваются для этой специализации шаблона включающего класса. [Example:

template<class T> struct A {
  template<class T2> struct B {};                     // #1
  template<class T2> struct B<T2*> {};                // #2
};

template<> template<class T2> struct A<short>::B {};  // #3

A<char>::B<int*>  abcip;  // uses #2
A<short>::B<int*> absip;  // uses #3
A<char>::B<int>  abci;    // uses #1

end example]