首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我不能通过类型定义声明一个朋友呢?

为什么我不能通过类型定义声明一个朋友呢?
EN

Stack Overflow用户
提问于 2008-12-24 19:37:20
回答 4查看 4.9K关注 0票数 20

有人知道为什么类名的typedefs不像友元声明中的类名那样工作吗?

代码语言:javascript
复制
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
};
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-24 19:49:43

目前还不能。我还不知道原因(只是查一下,因为我觉得它很有趣)。更新:您可以在第一个提案中找到原因,该提案支持将类型定义为名称作为朋友:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf。原因是标准只支持详细的类型说明符。只允许这些是很容易的,如果声明为friend的实体还没有声明,它将成为周围命名空间的成员。但是这意味着如果你想使用一个模板参数,你必须这样做(例如,一个类是必需的)

代码语言:javascript
复制
friend class T;

但这带来了额外的问题,而且被认为是不值得的。现在,本文建议允许提供额外的类型说明符(这样就可以使用模板参数和类型定义名)。

下一个C++版本(由于2010)将能够做到这一点。

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

票数 9
EN

Stack Overflow用户

发布于 2008-12-24 19:48:28

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

限制之一是同义词不能出现在类或结构前缀之后,也不能用作析构函数或构造函数名称。你也不能继承同义词的子类。我敢打赌,这也意味着你不能加它为好友。

票数 1
EN

Stack Overflow用户

发布于 2008-12-24 19:49:02

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

代码语言:javascript
复制
...
class C
{
public:
  friend class A;       
  friend X;             
  friend B::SUPERCLASS; 
};
...

它在编译时没有错误。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/392120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档