朋友功能不起作用

时间:2013-07-24 03:47:54

标签: c++ c++11

在下面的代码中,我试图让朋友函数访问该类的私有成员。根据我的理解,我正确地将其声明为朋友功能,但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 "";
}

2 个答案:

答案 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 "";
}