有谁知道为什么类名的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 };
Johannes Sch.. 9
目前它不能.我不知道原因(只是查找它,因为我发现它很有趣).更新:您可以在第一个提案中找到支持typedef-names为朋友的原因:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf.原因是标准仅支持详细类型说明符.很容易只允许那些,并且如果声明为expert的实体尚未声明,它将成为周围命名空间的成员.但这意味着如果你想使用模板参数,你必须这样做(例如,需要一个类)
friend class T;
但这带来了额外的问题,并认为不值得获益.现在,本文建议允许给出其他类型说明符(这样就可以使用模板参数和typedef-names).
下一个C++版本(由于2010年)将能够做到这一点.
请参阅此标准的更新提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf.它不仅允许typedef名称,还允许将模板参数用作声明为friend的类型.
目前它不能.我不知道原因(只是查找它,因为我发现它很有趣).更新:您可以在第一个提案中找到支持typedef-names为朋友的原因:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf.原因是标准仅支持详细类型说明符.很容易只允许那些,并且如果声明为expert的实体尚未声明,它将成为周围命名空间的成员.但这意味着如果你想使用模板参数,你必须这样做(例如,需要一个类)
friend class T;
但这带来了额外的问题,并认为不值得获益.现在,本文建议允许给出其他类型说明符(这样就可以使用模板参数和typedef-names).
下一个C++版本(由于2010年)将能够做到这一点.
请参阅此标准的更新提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf.它不仅允许typedef名称,还允许将模板参数用作声明为friend的类型.