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

时间:2011-05-13 15:03:51

标签: c++ typedef c++11 friend

struct A {};
typedef A B;

struct C { friend struct B; };

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

到目前为止,这看起来非常明显;毕竟,我的示例代码试图声明一个名为B的struct,这实际上不是struct-key

但是,如果friend struct A;实际上是一个复杂的,长篇大论的模板元混乱,我必须写A,这是不可取的。

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


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

2 个答案:

答案 0 :(得分:11)

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

struct A {};
typedef A B;

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

  friend int; // ignored
};

答案 1 :(得分:-1)

与友谊无关:

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

是错误,因为B已经是结构。