有谁知道为什么类名的类型定义不一样的类名工作为友元声明?

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 class T;

但是,这带来了另外的问题,并且它想通不值得增益。现在,提出了以允许给定的附加类型说明符(以使本然后允许使用的模板的参数和的typedef-名称)。

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

请参阅此更新的建议标准: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf 。它不会只允许typedef名称,而且模板参数用作声明为朋友类型。

其他提示

AFAIK,在C ++中的typedef不一起选择与类一起使用时创建一个完整的同义词。换句话说,它不是像宏。

其中的限制是同义词不能类或结构前缀之后出现,或者被用作析构或构造名称。你也不能子类的代名词。我敢打赌,也意味着你不能朋友吧。

我在VC ++ 8.0的代码试图:

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

有被编译没有错误。

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

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

原语,即浮子或int *没有定义与代码等的一个范围, 他们不“用”之类的反正。

不要忘记,也可以在“包”调用约定,对准attribs等编译器具体的东西在typedef,即由同一类,但具有不同的取向attribs实施的多个矢量类型。 => A型不是类,但反之亦然。

IMHO,声明一个朋友的typedef可以是有用的,但是,当从任何地方“类的typedef”可以被设置为的朋友,友谊可以变得非常难以理解,因此容易出错,特别是在模板被过度使用。

无效单一的typedef罐弄乱整个项目由于广泛的依赖关系。 模板的朋友和0X模板类型定义是有用的,但不放松的朋友申报的规则。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top