不能成为typedef的朋友:有什么特别的原因吗?

Lig*_*ica 10 c++ typedef friend c++11

struct A {};
typedef A B;

struct C { friend struct B; };
Run Code Online (Sandbox Code Playgroud)

GCC 4.7.0 20110427告诉我error: using typedef-name 'B' after 'struct'.

到目前为止,这似乎是不言自明的; 毕竟,我的示例代码试图声明和朋友一个struct被叫B,这实际上不是一个struct-key.

但是,我必须写friend struct A;一下,如果A实际上是一个复杂的,啰嗦的模板metahackery混乱,这是不可取的.

我错过了什么,或者我们实际上不是 friend通过类型别名的类型?如果没有,是否有任何特殊原因或仅仅是语言的怪癖?


这个问题之前提出了这个问题,但是已经过时了,并且对C++ 0x的问题进行了断言,这看似不真实.这个问题代替了C++ 0x FDIS.

Joh*_*itb 11

你可以成为任意类型的朋友(对于非类类型,将忽略朋友声明),但是你应该省略struct:

struct A {};
typedef A B;

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

  friend int; // ignored
};
Run Code Online (Sandbox Code Playgroud)

  • `error:声明朋友时必须使用类密钥 (2认同)