1

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>(){ 
} 

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

+0

Правильное предположение: если существует специализированность для 'T = int' и' U', а также специализация для 'U = int',' T' unspecialized, которые следует принимать, если 'T = int 'и' U = int'? – JohnB

+0

О, теперь я чувствую себя глупо ... – Soliter11

+0

Должен ли я ответить на вопрос или вы хотите? – Soliter11

ответ

0

Благодаря Johnb для ответа:

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

Еще один момент по skyjpack:

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

0

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

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

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

+0

Я видел похожие вопросы («Почему вывод шаблона аргумента не работает для конструкторов»), где что-то не допускается, потому что это неоднозначно. Я просто хотел узнать, какая ситуация может привести к двусмысленности. – Soliter11

+0

Кроме того, я спрашиваю о явной (полной) специализации, а не о частичной специализации, но я вижу вашу точку зрения. – Soliter11