Сложность с функцией поиска карты - PullRequest
0 голосов
/ 10 декабря 2018

У меня проблемы с выяснением, почему это не компилируется.Это только базовое объявление класса, конструктор / деструктор и другие функции не учтены.Сообщение также правильно определено где-то еще.

#include <vector>
#include <map>
using namespace std;
class SmartCarrier {
        map<string, vector <Message *>> accounts_map;
        void SearchMessage() const;

    };

Когда я пытаюсь присвоить m_iter с помощью m_iter = accounts_map.find(account), я получаю ошибку: ни один оператор "=" не соответствует этим операндам.Я дважды проверил, чтобы убедиться, что итератор карты был того же типа, что и карта.Я не уверен, что это неправильно.

void SmartCarrier::SearchMessage() const {
        string account;
        map<string, vector<Message *>>::iterator m_iter;
        cout << "Enter an account: ";
        cin >> account;
        try {
            m_iter = accounts_map.find(account);
            if (m_iter != accounts_map.end) {
                  //code to display account information
            } else {
                throw 'e';
            }
        } catch (char e) {
            cout << "Error: Account not found\n";
        }
    }

1 Ответ

0 голосов
/ 10 декабря 2018

SearchMessage() объявлен как const, поэтому его параметр this указывает на объект const SmartCarrier, поэтому его член accounts_map также равен const.Когда find() вызывается для const map, он возвращает const_iterator вместо iterator.

Кроме того, accounts_map.end должно быть вместо accounts_map.end().

Кроме того, использование исключения таким, какое вы есть, просто напрасно тратит накладные расходы, от которых вы можете (и должны) избавиться.

Попробуйте это:

void SmartCarrier::SearchMessage() const {
    string account;
    cout << "Enter an account: ";
    cin >> account;
    map<string, vector<Message *>>::const_iterator m_iter = accounts_map.find(account);
    if (m_iter != accounts_map.end()) {
        //code to display account information
    } else {
        cout << "Error: Account not found\n";
    }
}

Если вы используете C ++ 11или позже, рассмотрите возможность использования auto вместо const_iterator явно, это также исправит ошибку:

auto m_iter = accounts_map.find(account);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...