11

「MachineState」という構造体があり、「MachineState*」タイプのリストを作成しました。リストを反復しようとすると、「

error C2839: invalid return type 'MachineState **' for overloaded 'operator ->

私は Microsoft Visual Studio 10 を使用しています。エラーをグーグル検索したところ、「-> 演算子はクラス、構造体、または共用体、またはいずれかへの参照を返す必要があります」ということしかわかりませんでした。

Struct MachineState
{

   template <typename MachineTraits>
   friend class Machine;

   enum Facing { UP, RIGHT, DOWN, LEFT};
   MachineState()
    : m_ProgramCounter(1)
    , m_ActionsTaken(0)
    , m_Facing(UP)
    , m_Test(false)
    , m_Memory(nullptr)
    ,x(0)
    ,y(0)
    ,point1(25, 10)
    ,point2(10, 40)
    ,point3(40, 40)

   { }


   int m_ProgramCounter;
   int m_ActionsTaken;

   Facing m_Facing;
    bool m_Test;
    int x;
    int y;
    Point point1;
    Point point2;
    Point point3;

};

リストを次のように宣言します

 std::list<MachineState*> zombs;

ここで、リストを反復しようとすると、「it->point1」で式にクラス型へのポインターが必要であるというエラーが表示され続けます。

    for(std::list<MachineState*>::iterator it = zombs.begin(); it != zombs.end(); it++)
     {
        Point points[3] = {it->point1, it->point2, it->point3};
        Point* pPoints = points;
        SolidBrush brush(Color(255, 255, 0, 0));
        m_GraphicsImage.FillPolygon(&brush, pPoints,3);
     }

誰かが私に何が間違っているのか説明できるなら

4

1 に答える 1

27

itへのポインタへのイテレータMachineStateです。

イテレータを逆参照してからポインタを逆参照する必要があります

Point points[3] = {(*it)->point1, (*it)->point2, (*it)->point3};

編集:

逆参照とは、それが参照しているものを取得することを意味します。

*逆参照はor->演算子で行われます。

の場合itMachineState使用できますit.point1

itポインターである場合、またはMachineStateを使用できますit->point1(*it).point1

aへitイテレータの場合、またはMachineStateも使用できますit->point1(*it).point1

itへのポインタへのイテレータであるため、またはMachineStateを使用する必要があります。(*it)->point1(**it).point1

于 2013-04-24T04:11:50.890 に答える