我在命名空间中有一个类,该类包含一个私有函数。并且有一个全球功能。我希望这个全局函数成为我的类的朋友,它位于命名空间内。但是当我把它作为朋友时,编译器认为该函数不是全局的,而是在该命名空间本身内部。因此,如果我尝试使用全局函数访问私有成员函数,它就不起作用,而如果我在该命名空间中定义一个具有相同名称的函数,它就可以工作。以下是您可以看到的代码。
#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;
}
我也试着交朋友 friend void :: fun(); 它也无济于事。
答案 0 :(得分:17)
您需要使用全局范围运算符::
。
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
}
答案 1 :(得分:4)
fun()函数位于全局命名空间中。你需要一个原型:
void fun();
namespace Nayan
{
class CA
{
private:
static void funCA() {}
friend void ::fun();
};
}
void fun()
{
Nayan::CA::funCA();
}