4

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

2 回答 2

7

您正在定义::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 "";
    }
}
于 2013-07-24T03:52:01.340 回答
6

如果你想要一个全局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 "";
}
于 2013-07-24T04:00:12.953 回答