У вас может быть проблема с константной правильностью. const int *
может быть не тем, что вы думаю, что это. Это указатель на константу целое число. Это не то же самое, что тип ключа вашей карты, который представляет собой указатель на (непостоянное) целое число. И ни один из них не совпадает с int * const
, который является постоянным указателем на (непостоянное) целое число. Проблема не в том, является ли само значение ключа изменяемым или неизменным, а в том, являются ли вещи, на которые вы храните указатели, изменяемыми или неизменяемыми.
Например, это компилируется:
std::map<int *, double> mymap;
double myfind(int * const mykey) {
return mymap.find(mykey)->second;
}
Как и это:
std::map<const int *, double> mymap;
double myfind(const int *mykey) {
return mymap.find(mykey)->second;
}
double myfind2(const int * const mykey) {
return mymap.find(mykey)->second;
}
Вы видите разницу? В вашем исходном коде компилятор совершенно правильно отмечает ошибку. Если ваша функция принимает const int *
, то вы, по сути, обещаете не изменять int
, на который указывает указатель, который я передаю. Но если вы используете такой указатель, как int *
в ключе std::map
, вы можете позволить кому-то изменить что int
.
В этом конкретном случае мы знаем, что std::map::find()
не будет назначаться аргументу указателя, но компилятор этого не делает, поэтому const_cast<>
существует, как указано в других ответах.
person
TypeIA
schedule
08.02.2019
const_cast
- person BartekPL   schedule 08.02.2019std::less<int *>
иstd::less<const int *>
- person Caleth   schedule 08.02.2019