Почему Стандарт запрещает объявления товарищей о частичной специализации?
Стандарт С++ запрещает объявления сторонних специализаций. (§14.5.3/8):
Декларации друзей не должны объявлять частичную специализацию. [Пример:
template<class T> class A { };
class X {
template <class T> friend class A<T*>; //error
};
- конец примера]
Другие вопросы, например. этот,
получили ответы, которые ссылаются на этот запрет, но я хотел бы знать
обоснование. Я не вижу его и не могу найти его с помощью моей любимой поисковой системы. я
может найти, однако, что он возвращается к стандарту С++ 98, поэтому предположительно
обоснование является довольно простым и понятным. Может кто-нибудь объяснить это мне?
Ответы
Ответ 1
У меня нет ссылки, но я подозреваю, что это потому, что это приведет к тому, что частичная специализация будет объявлена в области класса объявления-объявления, а не в области рассматриваемого шаблона, и вместо создания куча правил, чтобы заставить объявление друга привести к тому, что специализация находится в правильной области, они просто запрещают ее.
Ответ 2
Вот какое-то непрямое объяснение:
http://www.cprogramming.com/tutorial/template_specialization.html
Окончательная деталь реализации связана с частичными специализациями: как компилятор выбирает, какую специализацию использовать, если есть сочетание полностью общих типов, некоторые частичные специализации, и, возможно, даже некоторые полные специализации? Общее эмпирическое правило что компилятор выберет наиболее конкретный шаблон специализация - наиболее специфическая специализированная специализация - такова чьи шаблонные аргументы будут приняты другим шаблоном деклараций, но которые не будут принимать все возможные аргументы, которые другие шаблоны с тем же именем будут принимать.
Я полагаю, что, возможно, не разрешается предотвращать какую-либо двусмысленность в определении типа специализации.