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

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

friend MyClass;

вместо

friend class MyClass;

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

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

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

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

friend class MyClass;

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

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

2 ответа

Решение

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

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

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

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

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

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

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

friend <declaration>

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

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

MyClass;

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

class MyClass;

или же:

struct MyClass;

являются.

То же самое для:

friend class MyClass;

или же

friend struct MyClass;
Другие вопросы по тегам