朋友功能仍然无法访问私人会员

kon*_*las 1 c++ namespaces friend friend-function

我有一个简单的C++类,我正在尝试添加流操作符,因此它可以与cout和一起使用cin

#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;
    };
}
Run Code Online (Sandbox Code Playgroud)

这是实现文件:

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;
}
Run Code Online (Sandbox Code Playgroud)

我在编译时遇到错误:

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;
Run Code Online (Sandbox Code Playgroud)

有类似的错误operator>>.该doThing方法编译没有问题.

我不确定我在这里缺少什么 - 朋友的功能是否应该能够访问班级的私人成员test

R S*_*ahu 5

您还需要在命名空间下定义这些函数.执行此操作时,可以省略命名空间的名称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;
  }
}
Run Code Online (Sandbox Code Playgroud)