String.Empty
и string.Empty
эквивалентны. String
имя класса BCL; string
его псевдоним C# (или ярлык, если Вы будете). То же как с Int32
и int
. См. документы для большего количества примеров.
До ""
затронут, я не действительно уверен.
Лично, я всегда использую string.Empty
.
Вы не можете хранить ссылки. Ссылки - это просто псевдонимы другой переменной .
Карта нуждается в копии строки для хранения:
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
'
Вы можете использовать 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;
}
Вы не можете использовать ссылки в качестве значения val из-за того, как построен шаблон. Вместо этого вы также можете использовать указатель.