Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';我不能通过typedef声明一个朋友吗?_C++ - Fatal编程技术网

C++ 为什么可以';我不能通过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

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

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;