Подтвердить что ты не робот

Ключ класса должен быть объявлен при объявлении друга

Компилятор g++ жалуется на эту ошибку, когда я объявляю друга таким образом:

friend MyClass;

вместо

friend class MyClass;

Зачем нужно ключевое слово class? (компилятор Borland С++, BTW, не требует этого.)

Не мог ли компилятор просто найти MyClass в таблице символов и сказать, что он был объявлен как класс? (очевидно, что это все равно, потому что он жалуется, когда MyClass не объявлен)

Не похоже, что он делает следующее объявление класса: мне все равно придется либо объявить класс выше, либо, по крайней мере, объявить его вперед.

Это имело бы смысл для меня (было бы здорово на самом деле), если

friend class MyClass;

делает форвардное объявление, если это необходимо, в противном случае это просто похоже на синтаксическую соль для меня.

Я очень весело использовал друга без ключевого слова class или struct без жалоб компилятора в течение почти 20 лет. Это что-то довольно новое?

4b9b3361

Ответ 1

Я был удивлен этим (и в результате удалил предыдущий неверный ответ). Стандарт С++ 03 гласит в 11.4:

Спецификатор специфицированного типа должен использоваться в объявлении друга для класса.

Затем, чтобы убедиться, что нет недоразумений, это сноски, которые:

Требуется ключ класса специфицированного спецификатора типа.

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

Теперь, что касается логики, вы должны спросить кого-то, кто знает больше о компиляторах (или стандартах), чем я.

Ответ 2

К вопросу вашего вопроса, , потому что это соответствует ISO/IEC 14882: 2003 (раздел 7.1.4). Конструкция friend по существу определяется как:

friend <declaration>

где <declaration> - допустимое объявление класса, структуры, шаблона или функции.

Таким образом,

MyClass;

не является допустимым объявлением, тогда как:

class MyClass;

или

struct MyClass;

есть.

То же, что:

friend class MyClass;

или

friend struct MyClass;