繁体   English   中英

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

[英]Why can't I declare a friend through a typedef?

有谁知道为什么类名的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
};

目前无法。 我还不知道原因(只是查找一下,因为我觉得它很有趣)。 更新:您可以在第一个建议中找到支持typedef名称作为朋友的原因: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf 原因是该标准仅支持精心设计的类型说明符。 仅允许它们很容易,并且说如果尚未声明为Friend的实体将被声明为周围名称空间的成员。 但这意味着,如果要使用模板参数,则必须这样做(例如,需要一个类)

friend class T;

但是,这带来了更多的问题,并且认为这样做是不值得的。 现在,本文提议允许提供其他类型说明符(以便随后允许使用模板参数和typedef-names)。

下一个C ++版本(由于2010)将可以实现。

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

AFAIK,在C ++中,当与类结合使用时,typedef不会创建完整的同义词。 换句话说,它不像宏。

限制条件之一是同义词不能出现在类或结构前缀之后,也不能用作析构函数或构造函数名称。 您也不能继承同义词。 我敢打赌,这也意味着您不能成为朋友。

我在VC ++ 8.0中尝试了以下代码:

...
class C
{
public:
  friend class A;       
  friend X;             
  friend B::SUPERCLASS; 
};
...

它被编译没有错误。

我不知道它是否特定于MS。

一个typedef定义一个类型。 Friend decls声明了朋友类或函数(基本上是作用域),然后可以“访问”声明类的非公共区域...

基本体(即float或int *)未使用代码等定义作用域,反正它们也不“使用”该类。

别忘了,您还可以在typedef中“打包”调用约定,对齐属性和其他特定于编译器的内容,即,由同一类实现但具有不同对齐属性的多个向量TYPES。 =>类型不是类,反之亦然。

恕我直言,声明一个朋友typedef可能是有用的,但是当可以从任何地方将“ class typedefs”设置为朋友时,友谊会变得非常难以理解,因此容易出错,尤其是在模板使用过多的情况下。

由于广泛的依赖关系,使单个typedef无效会使整个项目混乱。 模板好友和0x模板typedef很有用,但不要放松好友声明的规则。

我不知道有关朋友typedef的任何建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM