Информация об изменениях

Сообщение Re[4]: Специализация метода. Нужно устранить ошибку от 24.08.2022 15:24

Изменено 24.08.2022 15:28 Андрей Тарасевич

Re[4]: Специализация метода. Нужно устранить ошибку
Здравствуйте, vopl, Вы писали:

V>Здравствуйте, σ, Вы писали:


V>>>Напрямую — никак. Это будет частичная специализация, язык такое не позволяет.


σ>>Как можно понять, что template<typename T> void STest4<T>::foo<TypeH2>() это частичная специализация?


V>Ну, понять это достаточно просто: если после подстановки аргументов шаблон воплощается в тип/значение — то это полная специализация, а если все еще остается шаблоном — то это частичная. В приведенном куске метод foo принадлежит наблону STest4<T>, то есть сам продолжает быть шаблоном, занчт — частичная специализация. Еще примеры:


Это попытка ответа с точки зрения rationale, т.е. "длинный ответ" на вопрос почему это не разрешается. И вряд ли это точное/полное rationale.

Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем. Вы получите ту же ошибку и на

template <typename T>
struct S
{
  template <typename U> struct N {};
  template <> struct N<int> {};
};


(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)

Явные специализации шаблонов-членов должны объявляться в namespace scope и должны делаться только для конкретных специализаций охватывающего шаблона.
Re[4]: Специализация метода. Нужно устранить ошибку
Здравствуйте, vopl, Вы писали:

V>Здравствуйте, σ, Вы писали:


V>>>Напрямую — никак. Это будет частичная специализация, язык такое не позволяет.


σ>>Как можно понять, что template<typename T> void STest4<T>::foo<TypeH2>() это частичная специализация?


V>Ну, понять это достаточно просто: если после подстановки аргументов шаблон воплощается в тип/значение — то это полная специализация, а если все еще остается шаблоном — то это частичная. В приведенном куске метод foo принадлежит наблону STest4<T>, то есть сам продолжает быть шаблоном, занчт — частичная специализация. Еще примеры:


Это попытка ответа с точки зрения rationale, т.е. "длинный ответ" на вопрос почему это не разрешается. И вряд ли это точное/полное rationale.

Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем. Вы получите ту же ошибку и на

template <typename T>
struct S
{
  template <typename U> struct N {};
  template <> struct N<int> {};
};


(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)

Явные специализации шаблонов-членов должны объявляться в namespace scope и должны делаться только для конкретных специализаций охватывающего шаблона. То есть, подчеркиваю, это ограничение в равное мере распространяется и на вложенные шаблоны классов, то есть отсутствие частичной специализации функций тут вообще ни при чем.