在下面的代码中,我试图让朋友函数访问该类的私有成员。根据我的理解,我正确地将其声明为朋友功能,但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 "";
}
答案 0 :(得分:6)
您要定义::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 "";
}
}
答案 1 :(得分:5)
如果您想要全球r
:
namespace X
{
class S;
}
std::string r(X::S &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 "";
}