Следующее:
std::map<int, ClassA &> test;
дает:
error C2101: '&' on constant
В то время как следующее
std::map<ClassA &, int> test;
дает
error C2528: '_First' : pointer to reference is illegal
Последний кажется, что карта не может содержать ссылку для значения ключа, так как это должно иногда инстанцировать класса, и ссылка нельзя инстанцировать без объекта. Но почему первый случай не работает?
Хранить ссылки в контейнере stl незаконно, поскольку типы должны быть копируемыми и присваиваемыми. Ссылки не могут быть присвоены.
То, какая именно операция вызывает первую ошибку, зависит от реализации, но я предполагаю, что она связана с созданием ссылки и ее немедленным присвоением. Второе сообщение об ошибке похоже на то, что оно связано с построением индекса карты.
Если ваш тип маленький, вы можете скопировать его в карту, или, если он большой, подумайте об использовании указателей вместо этого, но помните, что контейнер не будет деаллоцировать объекты за вас, вам придется делать это явно самостоятельно.
Этот вопрос SO может быть вам интересен.
Вы не можете хранить ссылки, поскольку они не конструируются копированием (и некоторые операции будут невозможны, поскольку они также не конструируются по умолчанию).
Вы можете, однако, эмулировать поведение, используя указатель:
std::map<int, ClassA*> test;
Это немного раздражает, потому что вам нужно дважды разыменовывать:
std::map<int, ClassA*>::iterator it = test.begin();
it->second->foo();
но с map
это гораздо менее запутанно, чем с vector
или set
(это было бы (*it)->foo()
).
Наконец, есть некоторые проблемы (связанные с указателями):
§8.3.2 раздел 5
Не должно быть ссылок на ссылки, массивов ссылок и указателей на ссылки.
Вы, наверное, думаете о ссылках как о забавных указателях. Они не.