Re[6]: Специализация метода. Нужно устранить ошибку
От: Андрей Тарасевич Беларусь  
Дата: 24.08.22 16:21
Оценка:
Здравствуйте, σ, Вы писали:

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


σ>Кхм. Ващет, вопрос был про 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) {}
};


То есть этот странный запрет как будто ушел полностью.
Best regards,
Андрей Тарасевич
Отредактировано 24.08.2022 16:25 Андрей Тарасевич . Предыдущая версия .
Re[9]: Специализация метода. Нужно устранить ошибку
От: vopl Россия  
Дата: 24.08.22 16:22
Оценка:
Здравствуйте, σ, Вы писали:

σ>Предлагаю научиться


Тю.. Ты какой то обиженный что ли? Фу таким быть . Порицание .
Re[6]: Специализация метода. Нужно устранить ошибку
От: Андрей Тарасевич Беларусь  
Дата: 24.08.22 20:39
Оценка:
Здравствуйте, σ, Вы писали:

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


σ>Кхм. Ващет, вопрос был про template<typename T> void STest4<T>::foo<TypeH2>() { ... } (вне класса), а не про template<> void foo<TypeH1> (внутри класса)


Я посмотрел на комментарий `// ключевой момент`, который располагается внутри класса, и натуральным образом предположил, что речь идет именно об этом.
Best regards,
Андрей Тарасевич
Re[10]: Специализация метода. Нужно устранить ошибку
От: rg45 СССР  
Дата: 26.08.22 06:07
Оценка: :)
Здравствуйте, vopl, Вы писали:

σ>>Предлагаю научиться


V>Тю.. Ты какой то обиженный что ли? Фу таким быть . Порицание .


Ты не понимаешь, это просто такой стиль — педагогический сарказм. У него есть все ответы, но он их нам не говорит. Чтоб мы думали, искали, развивались...
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.08.2022 6:12 rg45 . Предыдущая версия . Еще …
Отредактировано 26.08.2022 6:08 rg45 . Предыдущая версия .
Re[5]: Специализация метода. Нужно устранить ошибку
От: flаt  
Дата: 26.08.22 06:17
Оценка:
Здравствуйте, SVV, Вы писали:



SVV>Я понимал, что вызов st5_1 выглядит как определение функции, но думал что, может, есть способ сказать компилятору, что это именно определения объектов. Нет так нет.


Способа два: либо через фигурные скобки, либо через двойные обычные.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.