я эту проблему преобразования с помощью этого кода с помощью C++ 11 стандарт:C++ 11: преобразование Const INT * для Int * с помощью unordered_set :: толкать
#include<unordered_set>
struct B
{
int x, y;
};
class A
{
struct hash
{
std::size_t operator()(int* const a) const
{
return std::hash<int>()(*a);
}
};
struct equal_to
{
std::size_t operator()(int* const a, int* const b) const
{
return std::equal_to<int>()(*a, *b);
}
};
private:
std::unordered_set< int*, hash, equal_to > set;
public:
void push(const B& b)
{
set.insert(&b.x);
}
};
Кто-нибудь знает, почему это? Я могу решить проблему, удалив модификатор «const» в аргументе «push». Но я не хочу этого, потому что аргумент «b» не изменяется.
Редактировать: Мое упрощение кода создало неопубликованный адрес. Я создал структуру B, чтобы удалить ее.
Это не C11. –
Голосование заново. Проблема заключается в 'set.insert (& a)', где 'a' имеет тип' const int & '. Адрес 'a' имеет тип« указатель на const int », но заданный объект ищет« указатель на (модифицируемый) int ». Такая путаница 'const' довольно распространена и требует ответа. –
Не связано с вашим вопросом, но вы храните адрес объекта, который может быть временным объектом в вашем наборе. После того, как 'a', который был передан методу' push', вышел из области действия, адрес недействителен и может привести к повреждению кучи или сбою приложений позже, если на него ссылаются (например, ваш метод 'equal_to'). – pstrjds