C++ 为什么可以';我不能通过typedef声明一个朋友吗?
有人知道为什么类名的typedef不能像好友声明的类名那样工作吗C++ 为什么可以';我不能通过typedef声明一个朋友吗?,c++,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::SUPERCLAS
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
};
AFAIK,在C++类中,当与类进行匹配时,不创建完整的同义词。换句话说,它不像宏
限制之一是同义词不能出现在类或结构前缀之后,也不能用作析构函数或构造函数名称。也不能对同义词进行子类化。我敢打赌,这也意味着你不能成为它的朋友。我在VC++8.0中尝试了以下代码:
...
class C
{
public:
friend class A;
friend X;
friend B::SUPERCLASS;
};
...
它编译时没有错误
我不知道它是否是MS特有的。目前不能。我还不知道原因(只是查找一下,因为我发现它很有趣)。更新:您可以在第一个建议中找到支持typedef名称为好友的原因:。原因是该标准只支持详细的类型说明符。很容易只允许这些,如果声明为friend的实体尚未声明,它将成为周围名称空间的成员。但这意味着,如果要使用模板参数,则必须这样做(例如,需要一个类) 但这带来了更多的问题,人们认为这不值得。现在,本文建议允许提供额外的类型说明符(这样就可以使用模板参数和typedef名称)
下一个C++版本(由于2010)将能够完成它。
请参阅本标准的更新提案:。它不仅允许typedef名称,还允许模板参数用作声明为friend的类型。typedef定义类型。Friend DECL声明Friend类或函数(基本上是作用域),这些类或函数随后可以“访问”声明类的非公共区域 原语,即float或int*不使用代码等定义作用域。, 他们无论如何都不会“使用”这个类 别忘了,您还可以在typedef中“打包”调用约定、对齐属性和其他特定于编译器的内容,即多个向量类型由同一个类实现,但具有不同的对齐属性。=>类型不是类,反之亦然 依我看,声明朋友类型定义可能很有用,但是当来自任何地方的“类类型定义”可以设置为朋友时,这种友谊会变得非常难以理解,因此容易出错,特别是在模板使用过度的情况下 由于广泛的依赖关系,使单个typedef无效可能会打乱整个项目。 模板好友和0x模板typedef很有用,但不要放松好友声明的规则 我不知道有任何关于typedefs朋友的建议
friend class T;