3

ここに画像の説明を入力してください

なぜ演算子=をオーバーロードするように求められるのですか?私は以前にstd::listを繰り返しましたが、そのような問題はありませんでした。

class Grup : public Shape {

private:

    std::vector<Shape*> continut;

public:

    static const std::string identifier;

    Grup();
    ~Grup();

    void add(Shape *shape);
    void remove(Shape *shape);
    void output(std::ostream &outs) const;
    void readFrom(std::istream &ins);
    void moveBy(int x, int y);

    friend std::ostream &operator<<(std::ostream &outs, const Grup &grup);
};


std::ostream &operator<<(std::ostream &outs, const Grup &grup)
{

 std::vector<Shape*>::iterator it;

    outs << "Grupul este format din: " << std::endl;

    for (it = continut.begin(); it != continut.end(); it++)
    {

    }    

    return outs;
}

エラー:「実行可能なオーバーロードはありません'='。」

4

2 に答える 2

5

(スクリーンショットの拡大後)grupはとして渡されているconstため、に割り当てることができないbegin()を返します。const_iteratoriterator

の宣言を次のように変更itします。

std::vector<Shape*>::const_iterator it;

auto注C++11では、次のタイプを推測するようにコンパイラーに指示するために使用できます。

for (auto it = grup.continut.begin(); it != grup.continut.end(); it++)
{
    outs << **s << std::endl;
}

C ++ 11の他の選択肢は、範囲ベースのforループです。

for (auto& shape: grub.continut)
{
    outs << *s << std::endl;
}

またはラムダstd::for_each()で:

std::for_each(grub.continut.begin(),
              grub.continut.end(),
              [&](Shape* s) { outs << *s << std::endl; });
于 2013-03-27T10:50:42.250 に答える
3

変化する:

std::vector<Shape *>::iterator it;

に:

std::vector<Shape *>::const_iterator it;
                      ^^^^^^

あなたが参照を渡しているようにconst Grup

または、C ++ 11を使用している場合:

for (auto it = grup.continut.begin(); it != grup.continut.end(); ++it)
{
     ...
}
于 2013-03-27T10:49:55.430 に答える