【问题标题】:Friend function still can't access private member好友功能仍然无法访问私人会员
【发布时间】:2018-06-19 17:37:24
【问题描述】:

我有一个简单的 C++ 类,我正在尝试向其中添加流运算符,因此它可以与 coutcin 一起使用

#include <iostream>

namespace testing_namespace {
    class test {
        friend std::ostream &operator<<(std::ostream &os, const test &o);
        friend std::istream &operator>>(std::istream &is, test &o);
    public:
        void doThing();
    private:
        int member;
    };
}

这是实现文件:

std::ostream &operator<<(std::ostream &os, const testing_namespace::test &o) {
    return os << o.member;
}

std::istream &operator>>(std::istream &is, testing_namespace::test &o) {
    return is >> o.member;
}

void testing_namespace::test::doThing() {
    std::cout << member << " thing" << std::endl;
}

我在编译时遇到错误:

In function 'std::ostream& operator<<(std::ostream&, const testing_namespace::test&)':
test.cpp:8:20: error: 'int testing_namespace::test::member' is private within this context
 return os << o.member;

operator&gt;&gt; 出现类似错误。 doThing 方法编译没有问题。

我不确定我在这里缺少什么 - 朋友函数不应该能够访问 test 类的私有成员吗?

【问题讨论】:

    标签: c++ namespaces friend friend-function


    【解决方案1】:

    您还需要在命名空间下定义这些函数。当你这样做时,你可以从test 中省略命名空间的名称。

    namespace testing_namespace 
    {
      std::ostream &operator<<(std::ostream &os, const test &o) {
        return os << o.member;
      }
    
      std::istream &operator>>(std::istream &is, test &o) {
        return is >> o.member;
      }
    }
    

    【讨论】:

    • 您不再需要在参数列表中键入testing_namespace::test。只要test 就可以了。
    • @Carl,真的。顺便说一句,我不知道你为什么删除你的答案。看到两个具有相同解决方案的答案是完全可以的。
    • 为了让未来的访问者更清楚地了解该帖子。认为只有一个答案会更有条理,因为它们几乎相同。
    猜你喜欢
    • 2021-11-15
    • 2021-01-02
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多