[英]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.