Ошибка C ++: передача 'const umap_int {aka const std :: unordered_map} аргумент «this» отбрасывает квалификаторы [-fpermissive] - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь получить постоянную ссылку обратно методом для сопоставленного значения unordered_map. Unordered_map является членом класса. Однако приведенный ниже код не работает и выдает ошибку, указанную в заголовке.

Я пытался изменить const umap_int::mapped_type & на const int &, который тоже не работал. Сработал стандартный пример возврата константной ссылки на переменную простого типа данных (int, double, ...).

#include <unordered_map>

using namespace std;

typedef unordered_map<int, int> umap_int;

class class_A{

    public:

    class_A(){
        for(int k=0; k<3;++k)
            M[k] = k;
    }

    const umap_int::mapped_type & get_M(int key) const{
        return M[key];
    }

    private:

    umap_int M;

};

int main(){

    class_A A;

    return 0;
}

1 Ответ

1 голос
/ 10 июля 2019

Внутри метода const вы можете вызывать только M его функции-члены const.Обе unordered_map::operator[] перегрузки неконстантны - ссылка .Поэтому вы не можете использовать его внутри const get_M.Вы можете удалить квалификатор const из сигнатуры get_M или использовать find, который имеет перегрузку const, но тогда вам нужно обработать случай, когда сопоставленное значение не существует для переданного ключа:

const umap_int::mapped_type & get_M(int key) const {
    //return M[key];
    auto it = M.find(key);
    if (it != M.end())
        return it->second;
    // do sth here ...
    // throw exception
    // make static variable with default value which will be accessed 
}
...