2012-01-18 95 views
0

这段代码有什么问题?封闭范围

class matrix{ 
private: 
    friend transpose(const matrix&); 
    friend class invert; 
    public: //... 
}; 
matrix (*p)(const matrix&)=&transpose; //error: no transpose() in scope. 

这句话是什么意思“的朋友声明不引入名字进入封闭的范围”。这不会发生问题时,朋友关键字已被移除

+2

首先,你的'转置'缺少它的返回类型。 – Xeo 2012-01-18 16:05:59

回答

1

转置()作为朋友声明而没有朋友声明的区别在于,如果您声明“朋友转置()”,您所做的只是告诉编译器一个具有朋友声明可以访问矩阵类型的对象的私有成员。它确实用而不是用这个签名声明了一个函数transpose() - 你仍然必须在矩阵类的范围之外这么做。

如果您删除'friend'关键字,那么您在类矩阵内部声明了一个成员函数transpose(),因此编译器实际上已经看到了一个函数,它可以取地址。

1

§7.3.1.2 [namespace.memdef] p3

[.. 。]如果非本地类中的某个friend声明首先声明一个类或函数,则该友元类或函数是最内层的封闭名称空间的成员。 通过非限定查找或合格查找找不到朋友的名字,直到在该名称空间范围中提供了匹配声明(在授予友谊的类定义之前或之后)。 [...]

另请参阅this question of mine

+0

如果我们只声明不在封闭范围中定义好友功能,那么它会起作用或不起作用?如果我们只是在封闭范围内声明而不声明它会怎么样 – 2012-01-18 17:12:17

0
  1. 朋友函数是不是类的成员,但 他们仍然可以访问类的私有成员函数。

  2. 我应该指出的是,一个朋友函数声明 可放置在任何私人部分或者公众部分,
    但它会在两种情况下公开的功能,所以它是更清楚 列表它公共部分。

class MyClass 
{ 
private: 
    int data; 
public: 
    MyClass(int value); 
    friend void myFriend(MyClass *myObject); 

}; 

void myFriend(MyClass *myObject) 
{ 
    cout << myObject->data<< endl; 
} 

MyClass::MyClass(int value) 
{ 
    data = value*2; 
} 

int main() 
{   
    MyClass myObject(3); 
    myFriend(&myObject); 
} 

所以,你需要声明后,定义友元函数。