表达式必须具有指向类的指针类型

时间:2013-04-24 04:08:00

标签: c++ list pointers struct iterator

我有一个结构“MachineState”,我创建了一个类型为“MachineState *”的列表。当我试图遍历列表时我会继续“

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

我正在使用Microsoft Visual Studio 10.我用Google搜索了错误,我发现的所有内容都是“ - >运算符必须返回一个类,结构或联合,或者引用一个。”

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-&gt; 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);
     }

如果有人能解释我的是什么wron

1 个答案:

答案 0 :(得分:22)

it指针的迭代器 MachineState

您需要取消引用迭代器然后指针。

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

修改

解除引用表示获取它所指的

取消引用是使用*->运算符完成的。

如果itMachineState,您可以使用it.point1

如果itMachineState指针,您可以使用it->point1(*it).point1

如果it迭代器MachineState,您还可以使用it->point1(*it).point1

由于it是指向<{1>}的指针的迭代器,因此您必须使用MachineState(*it)->point1