Сообщение Re[4]: Специализация метода. Нужно устранить ошибку от 24.08.2022 15:24
Изменено 24.08.2022 15:31 Андрей Тарасевич
Re[4]: Специализация метода. Нужно устранить ошибку
Здравствуйте, vopl, Вы писали:
V>Здравствуйте, σ, Вы писали:
V>>>Напрямую — никак. Это будет частичная специализация, язык такое не позволяет.
σ>>Как можно понять, что template<typename T> void STest4<T>::foo<TypeH2>() это частичная специализация?
V>Ну, понять это достаточно просто: если после подстановки аргументов шаблон воплощается в тип/значение — то это полная специализация, а если все еще остается шаблоном — то это частичная. В приведенном куске метод foo принадлежит наблону STest4<T>, то есть сам продолжает быть шаблоном, занчт — частичная специализация. Еще примеры:
Это попытка ответа с точки зрения rationale, т.е. "длинный ответ" на вопрос почему это не разрешается. И вряд ли это точное/полное rationale.
Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем. Вы получите ту же ошибку и на
(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)
Явные специализации шаблонов-членов должны объявляться в namespace scope и должны делаться только для конкретных специализаций охватывающего шаблона. То есть, подчеркиваю, это ограничение в равное мере распространяется и на вложенные шаблоны классов, то есть отсутствие частичной специализации функций тут вообще ни при чем.
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.
Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем. Вы получите ту же ошибку и на
(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)
Явные специализации шаблонов-членов должны объявляться в namespace scope и должны делаться только для конкретных специализаций охватывающего шаблона. То есть, подчеркиваю, это ограничение в равное мере распространяется и на вложенные шаблоны классов, то есть отсутствие частичной специализации функций тут вообще ни при чем.
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 и должны делаться только для конкретных специализаций охватывающего шаблона. То есть, подчеркиваю, это ограничение в равное мере распространяется и на вложенные шаблоны классов, то есть отсутствие частичной специализации функций тут вообще ни при чем.
template <typename T> struct S
{
template <typename U> struct N {};
};
template <> template <> struct S<int>::N<double> {}; // <- Так можно
template <typename T> template <> struct S<T>::N<double> {}; // <- А вот так нельзя