1

ヘッダーファイルには次のものがあります:

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

ありがとうございました。

4

1 に答える 1

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;
    }
  }
}
于 2013-07-25T08:28:17.440 に答える