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

Posted

技术标签:

【中文标题】表达式必须具有指向类类型的指针【英文标题】:Expression must have pointer-to-class-type 【发布时间】:2013-04-24 04:07:59 【问题描述】:

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

如果有人能解释我怎么了

【问题讨论】:

【参考方案1】:

it 是一个迭代器,指向一个指针,指向一个MachineState

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

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

编辑:

解除引用意味着得到它所引用的东西

使用*-&gt; 运算符完成取消引用。

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

如果it 是指向MachineState指针,您可以使用it-&gt;point1(*it).point1

如果itMachineState迭代器,您也可以使用it-&gt;point1(*it).point1

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

【讨论】:

这是正确的答案。对不起,我是 C++ 的初学者。你能告诉我取消引用是什么意思吗?非常感谢您的回答

以上是关于表达式必须具有指向类类型的指针的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的“表达式必须具有指向对象类型”和“下标需要数组或指针类型”是啥意思?

从 2D 向量创建 1D 向量的函数(错误:表达式必须具有指向对象的指针类型)

在 Visual Studio 中执行 C 程序时,表达式必须具有指向对象类型 ERROR 的指针

删除时出错:表达式必须是指向完整对象类型的指针

使用仿函数时,括号前的表达式必须具有指向函数的类型

明显调用括号前的表达式必须具有(指向)函数类型