Ошибка в that.vect.push_back (0) и that.vect.begin () при перегрузке «+» orerator в C ++ - PullRequest
4 голосов
/ 14 марта 2019
class Polinom {
     public:
        std::vector<double> vect;
        Polinom operator +(const Polinom &that) {
            if (this->vect.size() > that.vect.size()) {
                for (int i = that.vect.size(); i < this->vect.size(); i++)
                    that.vect.push_back(0);//here
            }
            else if (that.vect.size() > this->vect.size()) {
                for (int i = this->vect.size(); i < that.vect.size(); i++)
                    this->vect.push_back(0);
            }
            std::vector<double> sum;
            std::vector<double>::iterator i2 = that.vect.begin();//here
            for (std::vector<double>::iterator i1 = this->vect.begin(); i1 != this->vect.end(); ++i1)
                sum.push_back(*i2++ + *i1);
            return sum;
        }
        Polinom();
        Polinom(std::vector<double> vect) {
            this->vect = vect;
        }
        ~Polinom();
};

Код серьезности Описание Ошибка состояния подавления строки файла проекта (активно) E1087 нет экземпляра перегруженной функции "std :: vector <_Ty, _Alloc> :: push_back [with _Ty = double, _Alloc = std :: allocator]"соответствует списку аргументов и объекту (объект имеет спецификаторы типа, которые предотвращают совпадение)

Ответы [ 2 ]

7 голосов
/ 14 марта 2019
Polinom operator +(const Polinom &that) {
                   ^^^^^

that является константной ссылкой.

that.vect.push_back(0);//here

Поскольку that является константой, то и выражения доступа к члену через эту ссылку,Таким образом, that.vect является константным выражением.

push_back является неконстантной функцией-членом.Это изменяет вектор.Функция не может быть вызвана для константных векторов.

std::vector<double>::iterator i2 = that.vect.begin();//here

std::vector<T>::begin() const возвращает std::vector<T>::const_iterator.Это неявно преобразуется в std::vector<T>::iterator

Решение 1. Не пытайтесь вставлять элементы в константные векторы.

Решение 2. Используйте неконстантную ссылку, если вы собираетесь изменитьупомянутый объект.

В этом случае решение 1. представляется более разумным.Модификация операндов operator+ была бы нелогичной.Кроме того, вы, вероятно, должны сделать функцию const квалифицированной и избегать изменения this по той же причине.

4 голосов
/ 14 марта 2019

That является постоянным, поэтому вы не можете вернуться в него. Не уверен, что ты хочешь там делать. Выясните, хотите ли вы изменить that или нет, и передайте либо &, либо const&.

И that является константой, вы не можете получить iterator, только const_iterator (auto будет правильно его захватывать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...