Этот вопрос может быть немного отрывочным, потому что у меня нет кода, доступного дома, но я знаю, что эта штука в противном случае приведет к ошибкам в течение всего уик-энда.
Когда я попытался обновить код до С++ 11, я начал заменять std::map на std::unordered_map. Код использовал только std::map::find() для доступа к определенному элементу на карте, поэтому я решил, что замена должна быть простой. Возвращаемый итератор был сохранен в переменной auto -typed (auto res = map.find( x ), поэтому типизация должна быть прекрасной. Однако при доступе к сохраненному элементу с помощью res->second.do_stuff() я получил ошибку компилятора, сообщив мне, что struct std::pair<char, B> does not have a member second. Теперь это действительно смутило меня, но, к сожалению, у меня не было времени для дальнейшего изучения.
Возможно, этого достаточно информации, поэтому кто-то может дать мне подсказку по этой странной ошибке компилятора. Или я понимаю, что std::map и std::unordered_map должны иметь один и тот же интерфейс, кроме тех частей, которые нуждаются в упорядочении, а не правильно?
ИЗМЕНИТЬ
Как и обещал здесь еще один анализ проблемы. Скорее всего, это позволит кому-то помочь мне лучше сейчас. Как я уже догадался из комментариев в комментариях, это не было вызвано тем, что я обратился к элементам на карте, но какой-то другой частью кода. Я обнаружил, что я использовал карту в классе X для хранения указателей на другие элементы класса X (своего рода древовидная структура). Однако это работает для std::map, но не для std::unordered_map. Вот очень простой код, который показывает проблему:
#include <stdint.h>
#include <unordered_map>
#include <map>
class Test {
std::map<uint32_t, Test> m_map1; // Works
std::unordered_map<uint32_t, Test> m_map; // gives error: ‘std::pair<_T1, _T2>::second’ has incomplete type
};
int main() {
return 1;
}
std::map works std::unordered_map не работает. Любые идеи, почему это так, или что можно сделать, чтобы заставить его работать с std::unordered_map?