为什么我不能通过typedef声明朋友?

use*_*956 18 c++

有谁知道为什么类名的typedef不像朋友声明的类名那样工作?

class A
{
public:
};

class B : public A
{
public:
   typedef A SUPERCLASS;
};

typedef A X;

class C
{
public:
   friend class A;             // OK
   friend class X;             // fails
   friend class B::SUPERCLASS; // fails
};
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 9

目前它不能.我不知道原因(只是查找它,因为我发现它很有趣).更新:您可以在第一个提案中找到支持typedef-names为朋友的原因:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf.原因是标准仅支持详细类型说明符.很容易只允许那些,并且如果声明为expert的实体尚未声明,它将成为周围命名空间的成员.但这意味着如果你想使用模板参数,你必须这样做(例如,需要一个类)

friend class T;
Run Code Online (Sandbox Code Playgroud)

但这带来了额外的问题,并认为不值得获益.现在,本文建议允许给出其他类型说明符(这样就可以使用模板参数和typedef-names).

下一个C++版本(由于2010年)将能够做到这一点.

请参阅此标准的更新提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf.它不仅允许typedef名称,还允许将模板参数用作声明为friend的类型.