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作为 a 传入const,因此begin()将返回const_iterator不能分配给 a 的 a iterator

将声明更改it为:

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

注意 在 C++11 中,您可以使用auto来指示编译器推断类型:

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()使用lambda

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 回答