C ++ 11 compl ie ошибка при попытке вставить элемент в мультимножество - PullRequest
1 голос
/ 07 января 2020

Код был как показано ниже

#include <set>
#include <iostream>
#include <string>
#include <memory>

using namespace std;
class Quote {
    public:
        int getnum() {
            return num;
        }
    private:
        int num;
};

class basket {
    public:
        void add_item(const shared_ptr<Quote> &b) {
            setQuo.insert(b);
        }
    private:
        static bool compare(shared_ptr<Quote> &l, shared_ptr<Quote> &r) {
            return l->getnum() < r->getnum();
        }
        multiset<shared_ptr<Quote>, decltype(compare)*> setQuo{compare};
};


int main()
{
    cout << "start" << endl;
}

Я обнаружил, что setQuo.insert(b); приведет к ошибке compl ie. Compl ie ошибка была как показано ниже

*/usr/include/c++/7/bits/stl_tree.h:2069:51: error: binding reference of type ‘std::shared_ptr<Quote>&’ to ‘const key_type {aka const std::shared_ptr<Quote>}’ discards qualifiers
__x = _M_impl._M_key_compare(__k, _S_key(__x)) ?*

*/usr/include/c++/7/bits/stl_tree.h:1750:10: error: binding reference of type ‘std::shared_ptr<Quote>&’ to ‘const std::shared_ptr<Quote>’ discards qualifiers*

Код выглядел правильно для меня, этот вопрос меня действительно смутил.

1 Ответ

1 голос
/ 07 января 2020

Ваша compare функция не должна изменять элементы, которые она сравнивает, поэтому примите аргументы const&:

        static bool compare(const shared_ptr<Quote> &l, const shared_ptr<Quote> &r) {
            return l->getnum() < r->getnum();
        }

Демо

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