2013-11-29 2 views
6

С помощью следующего кода (Выдержки для краткости):C++ "ошибка: передача 'Const станд :: Карта <Int, станд :: basic_string <char>>' как 'этого' аргумент ..."

цвета. ч:

class color { 
public: 
    color(); 

    enum colorType { 
     black, blue, green, cyan, red, 
     magenta, brown, lightgray, nocolor 
    }; 

    colorType getColorType(); 
    void setColorType(colorType cColortype); 

    string getColorText() const; 

private: 
    colorType cColortype = nocolor; 
    map<int, string> colors = { 
     {black, "black"}, 
     {blue, "blue"}, 
     {green, "green"}, 
     {cyan, "cyan"}, 
     {red, "red"}, 
     {magenta, "magenta"}, 
     {brown, "brown"}, 
     {lightgray, "lightgray"}, 
     {nocolor, "nocolor"}}; 
}; 

color.cpp:

color::color() { 
} 

color::colorType color::getColorType() { 
    return cColortype; 
} 

void color::setColorType(colorType cColortype) { 
    this->cColortype = cColortype; 
} 

string color::getColorText() const { 
    return colors[cColortype]; 
} 

Я получаю следующее сообщение об ошибке:

color.cpp:16:29: error: passing 'const std::map >' as 'this' argument of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = int; _Tp = std::basic_string; _Compare = std::less; _Alloc = std::allocator > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::basic_string; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]' discards qualifiers [-fpermissive]

Ошибка относится к «цветам возврата [cColortype]»; в getColorText.

Я пишу это для проекта класса, и я могу заставить его работать ради назначения, удалив объявление const в подписи getColorText, но я пытаюсь изучить/принять хорошие практики и придерживаться рекомендуется использовать const для функций-членов, которые не изменяют данные, поэтому я хочу знать, как справиться с этим.

Я обычно хорошо разбираюсь в отладке/поиске неисправностей, но сообщение об ошибке настолько запутано, что это не очень помогает.

Любая помощь приветствуется.

+0

Моим первым предложением было бы удалить оператор индекса в цвете :: getColorText() const с std :: map <> :: найти вызов соответствующим образом. – nakiya

ответ

26
string color::getColorText() const { 
    return colors[cColortype]; 
} 

Проблема в том, что вы отметили функцию как const. operator[] на std::map отмечен как неконстантный и не может использоваться в такой функции const. Вам необходимо вручную использовать std::map::find (или другой механизм) для поиска типа ввода и обработать случай, когда он не найден.

Если вы используете C++ 11, вы можете использовать std::map::at, который разрешен для использования на постоянной карте и генерирует исключение, если запрашиваемый элемент отсутствует.

+0

std :: map :: отлично подходит для счета. Большое спасибо. – WXB13

+0

Да, std :: map :: at - это то, что мне действительно нужно. –

5

Ключ ближе к концу: «отбрасывает квалификаторы». getColorText - функция const, поэтому colors - const. Но map::operator[]() не const.

2

Во-первых: карта map<int, string> colors должна быть карта от cColorType в строку вместо междунар:

map<cColorType, string> colors 

Во-вторых: Как некоторые люди уже ответили: map::operator[]() не const. Причина этого в том, что этот оператор возвращает ссылку, которая позволяет вам изменять ее значение.

Позвольте мне предложить следующее решение: вы можете создать второй частный атрибут: цвет в строчном формате. Поэтому у вас будут две функции Get (по одному для каждого типа цвета) и одна функция Set (которая изменит два атрибута цвета).

+0

На самом деле cColorType - это имя переменной, а не тип. Возможно, вы имели в виду colorType. Это на самом деле необязательно, поскольку colorType представляет собой перечисление, которое сопоставляется с int, поэтому подпись «map colors» прекрасно работает. Часть кода, который я оставил вне моего сообщения, является аксессуаром, который принимает строку в качестве аргумента и выполняет обратный поиск карт по цветам для получения соответствующего colorType. Карта с обратным просмотром устраняет необходимость сохранения настроек цвета в двух разных форматах. – WXB13

+0

Да, ты прав насчет cColorType, мои извинения. Сохранение первой записи карты как «int» будет работать, но настройка ее на colorType более гибкая: представьте, что вы (или кто-то еще) перепишете этот код в будущем и хотите сделать что-то еще, кроме перечисления для colorType. Этот кодер не должен будет изменять объявление карты. Как вы выполняете «обратный поиск карты»? Я очень хочу видеть :) – Brainless

+0

Обратный поиск карты: http://stackoverflow.com/questions/5749073/reverse-map-lookup/19829556#19829556 – WXB13

Смежные вопросы