c++ - 好友功能失效

标签 c++ c++11

在下面的代码中,我试图让友元函数访问类的私有(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/

相关文章:

c++ - 将 std::vector 重命名为另一个类以进行重载?

c++ - 用于添加和比较 Integer 和 Fraction 类数据的运算符重载

c++ - 使用 lambda 调用的默认函数对象值作为函数参数

c++ - Boost date_time cpp 文件丢失

c++ - 这个 operator() 语法有什么作用?

c++ - 如何修改我的 C++ 程序以使用堆栈向后显示用户输入的单词?

c++ - 删除 char*[] 中的第一个索引

C++14 结合通用 lambda 和变量模板

c++ - 实例未在主函数中声明

c++ - 如何根据模板类型使用 std::enable_if 来启用或禁用构造函数?