为什么我不能在`friend`运算符中使用`private`字段?

时间:2013-07-25 08:25:47

标签: c++ friend

头文件包含它:

class Shape_definition {
private:
    // ...
    std::vector<Instruction> items;         
public:
    //...
    friend std::istream& operator >> (std::istream& is, Shape_definition& def); // FRIEND!
};
//-----------------------------------------------------------------------------
std::istream& operator >> (std::istream& is, Shape_definition& def);
//...

定义代码:

std::istream& operator >> (std::istream& is, Bushman::shp::Shape_definition& def){
    //...
    Bushman::shp::Instruction instr = Bushman::shp::Instruction::get_empty();
    while(is >> instr) def.items.push_back(instr); // Problem is here!
    return is;
}

但我在MS Visual Studio编辑器中收到错误:

  

错误C2248:'Bushman :: shp :: Shape_definition :: items':无法访问   在类'Bushman :: shp :: Shape_definition'

中声明的私有成员

为什么我无法使用private运算符中的friend字段?

谢谢。

1 个答案:

答案 0 :(得分:5)

经过一些侦探工作后,我假设Shape_definition是在命名空间内定义的,你的std::istream& operator >> (std::istream& is, Shape_definition& def);声明也是如此。

然后在命名空间外定义另一个 std::istream& operator >> (std::istream& is, Bushman::shp::Shape_definition& def)。由于这不是您的朋友,因此访问被阻止。

尝试将其定义为:

namespace Bushman
{
  namespace shp
  {
    std::istream& operator >> (std::istream& is, Bushman::shp::Shape_definition& def){
        //...
        Bushman::shp::Instruction instr = Bushman::shp::Instruction::get_empty();
        while(is >> instr) def.items.push_back(instr); // Problem is here!
        return is;
    }
  }
}