2013-04-24 65 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

相關問題