题
有谁知道为什么类名的类型定义不一样的类名工作为友元声明?
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任何建议。