在下面的代码中,我试图让友元函数访问类的私有(private)成员。据我了解,我正确地将其声明为友元函数,但 VS2012 给我错误:
error C2248: 'X::S::s_' : cannot access private member declared in class 'X::S'
谁能指出我做错了什么?这是演示我能想到的编译器错误的最简单示例。
namespace X
{
class S
{
friend std::string r(X::S &s);
std::unique_ptr<std::istream> s_;
};
}
std::string r(X::S &s)
{
auto& x = s.s_;
return "";
}
最佳答案
您正在定义 ::r
,而不是 X::r
,这是您的友元声明的用途。将函数移动到类旁边的命名空间中,或者在类内部定义它,尽管这对于类模板或保持类定义简洁可能会有问题。如果定义在一个单独的文件中,您仍然可以像处理类一样将其与命名空间一起括起来以将其添加到命名空间。我还建议删除 X::
限定条件,因为它已经在 X
中。
namespace X
{
class S
{
friend std::string r(S &s);
std::unique_ptr<std::istream> s_;
};
std::string r(S &s)
{
auto& x = s.s_;
return "";
}
}
关于c++ - 好友功能失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824876/