私は基本的な多態性の例をC++で次のような構造にしました。std :: listからポインタ上の関数を呼び出す<Shape*> :: iterator
struct Shape {
virtual void draw() = 0;
};
struct Circle : public Shape {
virtual void draw() {
cout << "drawing circle" << endl;
}
};
struct Triangle : public Shape {
virtual void draw() {
cout << "drawing triangle" << endl;
}
};
私は、次のような描画機能を呼び出すために、この設定を使用した機能を持っている:
void drawShapes(list<Shape*> shapes) {
list<Shape*>::iterator pShape = shapes.begin();
list<Shape*>::iterator pEnd = shapes.end();
for (; pShape != pEnd; pShape++) {
pShape->draw();
}
}
これは、例えば、私が読んでいる本の中で、セットアップで正確にどのようにあります。私はこれをコンパイルしようとすると、次のエラーが表示されます。
expression must have a pointer-to-class type
私は(*pShape)->draw()
にpShape->draw();
を変更することにより、これを修正しました。 >() -
私はその後、彼は
を対応する書籍の作家、に可能性のあるエラーとしてこれを提出した「それはSTD ::リスト::イテレータ演算子を持っているので、実際には、そうではないのですイテレータをT *(この場合はShape *)に解決する関数です。
私はまだ元のバージョンをコンパイルすることはできません。これらのテストを行うには、VS2015にバンドルされているコンパイラを使用しています。なぜ誰かがこのエラーを受けているのか知っていますか?
恐ろしい反応です。私は本が何であるか尋ねてもいいですか? – songyuanyao
もちろん、誰もが間違いを犯します。しかし、少なくとも応答する前に試してみるべきです。 – songyuanyao
pShapeはイテレータなので、イテレータのderef'ingは元のT値を生成します。この場合、Shape *はderef'dでなければなりません。 – Casey