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

Expression must have pointer-to-class-type

本文关键字:类型 指针 表达式      更新时间:2023-10-16

我有一个结构体"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);
     }

如果有人能告诉我是怎么回事

it是指向指针的迭代器指向MachineState

首先对迭代器解引用,然后对指针解引用。

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

解引用意味着获得它所引用的的内容。

*->操作符解引用。

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

如果it是指向MachineState指针,则可以使用it->point1(*it).point1

如果it是指向MachineState迭代器,也可以使用it->point1(*it).point1

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