Сообщение Re[6]: Специализация метода. Нужно устранить ошибку от 24.08.2022 16:21
Изменено 24.08.2022 16:25 Андрей Тарасевич
Re[6]: Специализация метода. Нужно устранить ошибку
Здравствуйте, σ, Вы писали:
АТ>>Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем.
σ>Кхм. Ващет, вопрос был про template<typename T> void STest4<T>::foo<TypeH2>() { ... } (вне класса), а не про template<> void foo<TypeH1> (внутри класса)
АТ>>
АТ>>(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)
σ>Неудивительно, его больше 5 лет как нет: https://cplusplus.github.io/CWG/issues/727.html
σ>И запрет выпилили в статусе defect report-а, т.е. с ретроактивным применением выпиливания.
Ах вот оно что! Я просто пошел на поводу у GCC, который до сих пор выдает ошибку. (Clang с версии 7 не страдает этой проблемой.)
В поисках по стандарту я как раз таки нашел вот это самое
> 3 An explicit specialization may be declared in any scope in which the corresponding primary template may be defined (9.8.2.3, 11.4, 13.7.3).
Но как тогда выражен запрет это делать для шаблонов функций-членов?
АТ>>Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем.
σ>Кхм. Ващет, вопрос был про template<typename T> void STest4<T>::foo<TypeH2>() { ... } (вне класса), а не про template<> void foo<TypeH1> (внутри класса)
АТ>>
σ>template <typename T> struct S
σ>{
σ> template <typename U> struct N {};
σ> template <> struct N<int> {}; // <- Ошибка
σ>};
σ>
АТ>>(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)
σ>Неудивительно, его больше 5 лет как нет: https://cplusplus.github.io/CWG/issues/727.html
σ>И запрет выпилили в статусе defect report-а, т.е. с ретроактивным применением выпиливания.
Ах вот оно что! Я просто пошел на поводу у GCC, который до сих пор выдает ошибку. (Clang с версии 7 не страдает этой проблемой.)
В поисках по стандарту я как раз таки нашел вот это самое
> 3 An explicit specialization may be declared in any scope in which the corresponding primary template may be defined (9.8.2.3, 11.4, 13.7.3).
Но как тогда выражен запрет это делать для шаблонов функций-членов?
Re[6]: Специализация метода. Нужно устранить ошибку
Здравствуйте, σ, Вы писали:
АТ>>Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем.
σ>Кхм. Ващет, вопрос был про template<typename T> void STest4<T>::foo<TypeH2>() { ... } (вне класса), а не про template<> void foo<TypeH1> (внутри класса)
АТ>>
АТ>>(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)
σ>Неудивительно, его больше 5 лет как нет: https://cplusplus.github.io/CWG/issues/727.html
σ>И запрет выпилили в статусе defect report-а, т.е. с ретроактивным применением выпиливания.
Ах вот оно что! Я просто пошел на поводу у GCC, который до сих пор выдает ошибку. (Clang с версии 7 не страдает этой проблемой.)
В поисках по стандарту я как раз таки нашел вот это самое http://eel.is/c++draft/temp.expl.spec#3
> 3 An explicit specialization may be declared in any scope in which the corresponding primary template may be defined (9.8.2.3, 11.4, 13.7.3).
Но это как будто снимает запрет и для функций тоже. Тот же самый Clang молча проглатывает и
То есть этот странный запрет как будто ушел полностью.
АТ>>Прямой "короткий" ответ на вопрос не имеет никакого отношения ни к каким частичным специализациям функций. Язык просто запрещает объявление явных специализаций любых шаблонов внутри определения охватывающего шаблона класса. Этот запрет в одинаковой мере распространяется и на классы, и на функции, т.е. отсутствие частичной специализации функций тут вообще ни при чем.
σ>Кхм. Ващет, вопрос был про template<typename T> void STest4<T>::foo<TypeH2>() { ... } (вне класса), а не про template<> void foo<TypeH1> (внутри класса)
АТ>>
σ>template <typename T> struct S
σ>{
σ> template <typename U> struct N {};
σ> template <> struct N<int> {}; // <- Ошибка
σ>};
σ>
АТ>>(Я все время забываю, где этот запрет сформулирован в стандарте и навскидку не могу его найти.)
σ>Неудивительно, его больше 5 лет как нет: https://cplusplus.github.io/CWG/issues/727.html
σ>И запрет выпилили в статусе defect report-а, т.е. с ретроактивным применением выпиливания.
Ах вот оно что! Я просто пошел на поводу у GCC, который до сих пор выдает ошибку. (Clang с версии 7 не страдает этой проблемой.)
В поисках по стандарту я как раз таки нашел вот это самое http://eel.is/c++draft/temp.expl.spec#3
> 3 An explicit specialization may be declared in any scope in which the corresponding primary template may be defined (9.8.2.3, 11.4, 13.7.3).
Но это как будто снимает запрет и для функций тоже. Тот же самый Clang молча проглатывает и
template <typename T> struct S
{
template <typename U> void foo(U u) {}
template <> void foo(int u) {}
};
То есть этот странный запрет как будто ушел полностью.