Не умеет дружить с typedefs: какая-то конкретная причина? - PullRequest
10 голосов
/ 13 мая 2011
struct A {};
typedef A B;

struct C { friend struct B; };

GCC 4.7.0 20110427 говорит мне error: using typedef-name 'B' after 'struct'.

Пока это кажется довольно очевидным;В конце концов, мой пример кода пытается объявить и отправить другу struct с именем B, что на самом деле не struct-key.

Однако я должен написать friend struct A;, если Aна самом деле это сложный, многословный беспорядок мета-хакерства шаблонов, это нежелательно.

Я что-то упустил, или мы можем на самом деле не friend печатать через псевдонимы типов?Если нет, есть ли какая-то конкретная причина или это просто причуды языка?


Этот вопрос поднимал вопрос раньше, но устарел и делает утверждения по этому вопросуотносительно C ++ 0x, которые не кажутся правдой. Этот вопрос вместо этого относится к C ++ 0x FDIS.

Ответы [ 2 ]

11 голосов
/ 13 мая 2011

Вы можете подружиться с произвольными типами (для не-классовых типов объявление друга будет проигнорировано), но тогда вы должны пропустить struct:

struct A {};
typedef A B;

struct C { 
  friend B; // equivalent: friend struct A;
            // equivalent: friend A;

  friend int; // ignored
};
0 голосов
/ 13 мая 2011

Ничего общего с дружбой:

struct A {};
typedef A B;
struct B b;

Ошибка, потому что B уже является структурой.

...