Почему я получаю ошибку в “формировании ссылки на ссылочный тип” карта?

String.Empty и string.Empty эквивалентны. String имя класса BCL; string его псевдоним C# (или ярлык, если Вы будете). То же как с Int32 и int. См. документы для большего количества примеров.

До "" затронут, я не действительно уверен.

Лично, я всегда использую string.Empty.

22
задан GEOCHET 21 July 2009 в 19:21
поделиться

3 ответа

Вы не можете хранить ссылки. Ссылки - это просто псевдонимы другой переменной .

Карта нуждается в копии строки для хранения:

map<pair<string, string>, string> m;

Причина, по которой вы получаете эту конкретную ошибку, заключается в том, что где-то на карте она будет делать операция с mapped_type , которым в вашем случае является строка и . Одна из этих операций (например, в operator [] ) вернет ссылку на mapped_type :

mapped_type& operator[](const key_type&)

Что, с вашим mapped_type , будет be:

string&& operator[](const key_type& _Keyval)

И у вас не может быть ссылки на ссылку:

Стандарт 8.3.4:

Не должно быть ссылок на ссылки, массивов ссылок и указателей на ссылки.


Кстати, я бы порекомендовал вам использовать typedef '

35
ответ дан 29 November 2019 в 03:40
поделиться

Вы можете использовать boost :: reference_wrapper для хранения ссылок в контейнерах STL. Вот ваш измененный пример (не тестировался и определенно не очень хорошо написан, просто иллюстрирует точку)

#include <map>     
#include<iostream>
#include<string>   
#include <boost/ref.hpp>



int main()
{
   typedef std::pair< std::string, std::string> PairType;
   typedef std::map< PairType, boost::reference_wrapper<std::string> > MapType;
   std::string test = "Hello there!!";
   MapType m;
   PairType pp =  std::make_pair("aa","bb");
   m.insert(std::make_pair(pp , boost::ref(test) ) );

   MapType::iterator it (m.find( pp ) );
   if(it != m.end())
   {
       std::cout << it->second.get() << std::endl;
   }

   //change test
   test = "I am different now";
   std::cout << it->second.get() << std::endl;

   return 0;
}
9
ответ дан 29 November 2019 в 03:40
поделиться

Вы не можете использовать ссылки в качестве значения val из-за того, как построен шаблон. Вместо этого вы также можете использовать указатель.

2
ответ дан 29 November 2019 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: