構造体「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};
編集:
逆参照は、参照しているものを取得することを意味します。
逆参照は、*
または->
演算子を使用して行われます。
it
がMachineState
の場合、it.point1
を使用できます
it
がポインタからMachineState
の場合、it->point1
または(*it).point1
を使用できます。
it
がiteratorからMachineState
の場合、it->point1
または(*it).point1
を使用することもできます。
it
はポインタへのイテレータMachineState
へのイテレータであるため、(*it)->point1
または(**it).point1
を使用する必要があります