Почему явная специализация члена не допускается без специализации класса?

Стандарт C ++ гласит следующее:

В явном объявлении специализации для члена шаблона класса или шаблона члена, который
появится в области имен, шаблон члена и некоторые из его шаблонов классов могут остаться
неспециализированный, кроме этого объявление не должно явно специализировать шаблон члена класса, если его
шаблоны классов также не являются явно специализированными
. (14.7.3 / 16 начиная с C ++ 11 и 14.7.3 / 18 в старых стандартах)

Это означает, что следующее невозможно:

template<typename T>
class foo {
template<typename U>
void bar();
};

template<typename T>
template<>
void foo<T>::bar<some_type>(){
}

Уже было много вопросов о людях, имеющих проблемы, связанные с этим, на которые более или менее отвечал вопрос «стандарт так говорит». На самом деле я не понимаю, почему существует такое ограничение.

1

Решение

Спасибо JohnB за ответ:

В случае, когда существует одна специализация только для класса (например, T=int) и другая специализация только для участника (например, U=int), было бы невозможно решить, какую специализацию использовать.

Еще один момент от Skyjpack:

Там может быть специализация класса без функции-члена.

0

Другие решения

Функция шаблона создается, когда она впервые используется или когда она специализирована.

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

В комментариях люди говорят, что это может привести к неоднозначности, но многое может привести к неоднозначности. Подумайте о перегруженных функциях, например. Если неоднозначно, какую перегруженную функцию вызывать, компилятор сообщит вам об этом. То же самое в этом случае.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector