2013-04-24 127 views
10

我有一个结构“MachineState”,我创建了一个“MachineState *”类型的列表。当我尝试通过列表迭代我不断收到“表达式必须具有指针类型

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

我使用微软的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“说t他表达式必须有一个指向类类型的指针。

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

回答

19

it是一个迭代的指针MachineState

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

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

编辑:

提领意味着得到,它的指的东西。

解除引用是使用*->运算符完成的。

如果it是一个MachineState,你可以使用it.point1

如果it是一个指针MachineState,你可以使用it->point1(*it).point1

如果it是一个迭代MachineState,你也可以使用it->point1(*it).point1

由于it迭代器的指针MachineState,你必须使用(*it)->point1(**it).point1

+0

这是正确的答案。对不起,我是C++的初学者。你能否通过解引用告诉我你的意思?非常感谢你的回答 – 2013-04-24 04:21:27

+0

@JohnKemp看我的编辑。 – 2013-04-24 04:33:00

+1

谢谢@DrewDormann。现在我明白了 – 2013-04-24 06:29:46

相关问题