好友功能仍然无法访问私有成员
Friend function still can't access private member
我有一个简单的 C++ class,我正在尝试向其中添加流运算符,因此它可以与 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;
};
}
这是实现文件:
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>>
也有类似的错误。 doThing
方法编译没有问题。
我不确定我在这里遗漏了什么 - 友元函数不应该能够访问 class test
的私有成员吗?
你也需要在命名空间下定义这些函数。当你这样做时,你可以从 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;
}
}
我有一个简单的 C++ class,我正在尝试向其中添加流运算符,因此它可以与 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;
};
}
这是实现文件:
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>>
也有类似的错误。 doThing
方法编译没有问题。
我不确定我在这里遗漏了什么 - 友元函数不应该能够访问 class test
的私有成员吗?
你也需要在命名空间下定义这些函数。当你这样做时,你可以从 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;
}
}