2010-07-12 32 views
7

Tôi có một lớp bên trong một vùng tên và lớp đó chứa một hàm riêng. Và có một chức năng toàn cầu. Tôi muốn chức năng toàn cục đó trở thành bạn của lớp tôi ở bên trong không gian tên. Nhưng khi tôi làm cho nó như một người bạn, trình biên dịch nghĩ rằng hàm không phải là toàn cầu và nó nằm bên trong không gian tên đó. Vì vậy, nếu tôi cố gắng truy cập chức năng thành viên riêng với chức năng toàn cầu, nó không hoạt động, trong khi nếu tôi định nghĩa một hàm có cùng tên trong chính vùng tên đó thì nó hoạt động. Dưới đây là mã bạn có thể xem.Chức năng người bạn không thể truy cập chức năng riêng nếu lớp nằm trong vùng tên

#include <iostream> 
#include <conio.h> 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA(); 
     friend void fun(); 
    }; 

    void CA::funCA() 
    { 
     std::cout<<"CA::funCA"<<std::endl; 
    } 

    void fun() 
    { 
     Nayan::CA::funCA(); 
    } 

} 

void fun() 
{ 
    //Nayan::CA::funCA(); //Can't access private member 
} 


int main() 
{ 
    Nayan::fun(); 
    _getch(); 
    return 0; 
} 

Tôi cũng đã cố gắng kết bạn với tư cách là bạn bè void :: fun(); Và nó cũng không giúp ích gì.

Trả lời

17

Bạn cần sử dụng toán tử phạm vi toàn cầu ::.

void fun(); 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA(); 
     friend void fun(); 
     friend void ::fun(); 
    }; 

    void CA::funCA() 
    { 
     std::cout<<"CA::funCA"<<std::endl; 
    } 

    void fun() 
    { 
     Nayan::CA::funCA(); 
    } 

} 


void fun() 
{ 
    Nayan::CA::funCA(); //Can access private member 
} 
+0

Tôi tin rằng những gì compilernayan dự định là khai báo niềm vui() bên ngoài không gian tên Nayan. –

+1

@Vitor Py: Ya tôi biết nhưng nó không làm tổn thương để hiển thị sự khác biệt một cách rõ ràng. Mỗi người bạn đề cập đến một cái gì đó khác nhau. –

4

Hàm fun() nằm trong không gian tên chung. Bạn cần một mẫu thử nghiệm:

void fun(); 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA() {} 
     friend void ::fun(); 
    }; 

} 

void fun() 
{ 
    Nayan::CA::funCA(); 
} 
Các vấn đề liên quan