В разделе 7.1.5.3 стандарта явным образом описывается это как пример неформального подробного спецификатора типа.
Обсуждение этого вопроса можно найти здесь .
При исследовании ответа на вопрос (на основе этого ответа ) я попытался сделать следующее:
template <class T>
class friendly {
friend class T;
};
friendly<string> howdy;
Это не скомпилируется со следующей ошибкой:
error: параметр шаблона «T» не может использоваться в специфицированном спецификаторе типа <int> class T;
Из того, что я могу понять из моего хорошего int f () {return T :: foo (); } Google это так, что я не буду случайно пытаться создать экземпляр, friend
но почему это должно быть ошибкой при компиляции шаблона? Должна ли быть ошибка при создании шаблона с недопустимым типом (например, если бы я написал )template <typename T> class R { friend T; }; R<C> rc; // class C is a friend of R<C> R<int> ri; // OK: a€?friend int;a€? is ignored
Немного больше googleling поднял Extended friend
Declarations (PDF) для C ++ 0x .
Этот документ содержит следующее:
friend
Это еще больше, чем то, что я думал (игнорируя незаконные friend
замедление, а не неудачу во время создания экземпляра). Поэтому я думаю, что ответ заключается в том, что нет веской причины, и он исправляется.