C++重载流插入/提取运算符声明友元后无法访问类私有成员
问题原因
- 你在命名空间
N内部的Obj类中声明的友元operator<<,默认归属N命名空间 - Obj.cpp中定义的
operator<<没有指定归属N命名空间,属于全局命名空间下的独立函数,和类内声明为友元的函数不是同一个实体,因此不具备私有成员访问权限。using namespace N;只是引入命名空间内的符号到当前作用域,不会将新定义的函数自动归入N命名空间。
解决方案
有两种可行的修复方式:
方式1:将运算符实现包裹在N命名空间内
修改Obj.cpp代码如下:
#include "Obj.h" #include <iostream> using namespace std; namespace N { ostream &operator<<(ostream &output, const Obj &a) { output << a.h; return output; } }
方式2:显式指定运算符归属N命名空间
修改Obj.cpp的函数定义签名,添加命名空间前缀即可:
#include "Obj.h" #include <iostream> using namespace std; ostream &N::operator<<(ostream &output, const Obj &a) { output << a.h; return output; }
内容的提问来源于stack exchange,提问作者ron252
相关产品推荐
相关产品推荐

