2013-05-15 2 views
14

Стандарт C++ запрещает объявления сторонних специализаций. (§14.5.3/8):Почему стандарт запрещает объявления товарищей о частичной специализации?

В декларациях сторон не декларируются частичные специализации. [Пример:

template<class T> class A { }; 
class X { 
    template <class T> friend class A<T*>; //error 
}; 

--end пример]

Другие вопросы, например, this one, получили ответы, которые ссылаются на этот запрет, но я хотел бы знать обоснование . Я не вижу его и не могу найти его с помощью моей любимой поисковой системы. I может найти, однако, что он вернется к стандарту C++ 98, поэтому предположительно обоснование достаточно просто и понятно. Может кто-нибудь объяснить это мне?

+3

Как это «неконструктивно»? –

+0

@LuchianGrigore: грубое предположение: это вопрос о возможных мнениях – PlasmaHH

+1

@PlasmaHH, если не ответит кто-то, кто действительно знает причину (как и большинство вопросов) :) –

ответ

0

Вот некоторые undirect объяснение: http://www.cprogramming.com/tutorial/template_specialization.html

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

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

+0

Можете ли вы привести пример, где бы он был (если разрешен) причиной выбора специализация должна быть двусмысленной? – David

+0

@faith_k, Спасибо за ваш ответ, но это спекулятивно. Должен быть окончательный ответ, и люди, которые это знают, поэтому я буду держаться. –

+0

Я вообще этого не покупаю. Хотя правила разрешения могут быть сложными, они по-прежнему принимают решение по конкретному делу. И общий спецификатор «friend template» фактически делает всех специализаций друзьями. Почему спецификатор дружбы частичной специализации не может применяться ко всем специализациям (включая экземпляры), которые соответствуют указанному шаблону? – davmac

1

У меня нет ссылки, но я подозреваю, что это связано с тем, что частичная специализация будет объявлена ​​в области класса объявления-объявления, а не в области рассматриваемого шаблона, а не для создания куча правил, чтобы заставить объявление друга привести к тому, что специализация находится в правильной области, они просто запрещают ее.

+0

Спасибо за ваш ответ, но он спекулятивный. Должен быть окончательный ответ, и люди, которые это знают, поэтому я буду держаться. –

Смежные вопросы