有人知道为什么类名的typedefs不像友元声明中的类名那样工作吗?
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
};
发布于 2008-12-24 19:49:43
目前还不能。我还不知道原因(只是查一下,因为我觉得它很有趣)。更新:您可以在第一个提案中找到原因,该提案支持将类型定义为名称作为朋友:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf。原因是标准只支持详细的类型说明符。只允许这些是很容易的,如果声明为friend的实体还没有声明,它将成为周围命名空间的成员。但是这意味着如果你想使用一个模板参数,你必须这样做(例如,一个类是必需的)
friend class T;
但这带来了额外的问题,而且被认为是不值得的。现在,本文建议允许提供额外的类型说明符(这样就可以使用模板参数和类型定义名)。
下一个C++版本(由于2010)将能够做到这一点。
请参阅该标准的更新提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf。它不仅允许使用类型定义名称,还允许使用模板参数作为声明为friend的类型。
发布于 2008-12-24 19:48:28
在C++类型定义中,当与类结合使用时,AFAIK不会创建完全成熟的同义词。换句话说,它不像宏。
限制之一是同义词不能出现在类或结构前缀之后,也不能用作析构函数或构造函数名称。你也不能继承同义词的子类。我敢打赌,这也意味着你不能加它为好友。
发布于 2008-12-24 19:49:02
我在VC++ 8.0中尝试了以下代码:
...
class C
{
public:
friend class A;
friend X;
friend B::SUPERCLASS;
};
...
它在编译时没有错误。
我不知道它是否是MS特定的。
https://stackoverflow.com/questions/392120
复制相似问题