朋友混淆

时间:2010-09-03 02:49:16

标签: c++ friend

$ 11.4 / 5 - “[...]在类中定义的友元函数位于定义它的类的(词法)范围内[...]”

这句话是什么意思?

struct A{
   typedef int MYINT;
   void f2(){f();}                    // Error, 'f' is undefined
   friend void f(){MYINT mi = 0;}     // Why does this work, shouldn' it be A::MYINT?
   void f1(){f();}                    // Error, 'f' is undefined
};

int main(){}
  1. 这里令人困惑的是,从'A :: f1'调用'f'是可以理解的。然而,当一个朋友处于好友阶层的“词汇”范围时,为什么从'A :: f2'调用'f'是不正确的? “词汇”范围意味着什么?

  2. 在同一类型中,为什么在'f'中使用'MYINT'可以?不应该是'A :: MYINT'吗?

  3. 如果我将'A *'类型的参数添加到'f',那么'f1'和'f2'都能够因为ADL而找到'f'。这是可以理解的。

2 个答案:

答案 0 :(得分:1)

您仅引用了§11.4/ 5的部分内容。根据它f()应该首先在类之外声明(函数应该具有命名空间范围)。试试这个:

void f(); // declare it first
struct A{
   typedef int MYINT;
   void f2(){f();}                    
   friend void f(){MYINT mi = 0;}     // definition of global f, a friend of A
   void f1(){f();}                    
};

至于第二个问题,因为你引用了§11.4/ 5的部分内容,这是可以的。 f()遵循与名称绑定相同的规则作为该类的静态成员函数,并且对封闭类的成员没有特殊的访问权限。

答案 1 :(得分:0)

这是我对查询的一部分的解释

  

“为什么MYINT”可以称为   “MYINT”而不是“A :: MYINT”?

     

$ 3.4.1 / 9状态 - “查找名称   a的定义中使用的名称   友元函数(11.4)内联定义   在授予友谊的阶级中   按照查找中所述进行操作   成员函数定义。如果   朋友功能没有在中定义   授予友谊,姓名查找的类   在友元函数定义中   应按照查询的描述进行   在命名空间成员函数中   定义“。

在我们的例子中,要查找的名称是'MYINT',这是一个不合格的名称。在类中内联定义的朋友'f'的定义中查找此名称将与'A'的成员函数相同。

  

我的理解是否正确?