我收到一个从C#dll到C ++ / CLI代码的字典。我正在尝试将字典转换为std :: map,这将由旧的C ++代码进一步使用。但我无法做到。我有一个函数,它将字典作为参数并返回一个地图。
这就是我想要做的事情 -
std::map < std::wstring, std::map<int, int>> Convert(Dictionary<String^, Dictionary<int, int>^>^ myMap)
{
std::map < std::wstring, std::map<int, int>> h_result;
for (std::wstring& stringKey : myMap->Keys)
{
for (std::pair<int, int> intKey : (myMap->Values))
{
h_result.insert(stringKey, intKey);
}
}
return h_result;
}
我在迭代值时遇到错误。
错误:这个基于范围的'for'语句需要一个合适的“开始”功能,但没有找到
有谁能告诉我这里有什么问题?或者如果有更好的方法将Dictionary^
转换为std::map
,请建议我。
我是字典和std :: map的新手。如果示例代码有任何愚蠢的错误,请告诉我。
答案 0 :(得分:1)
您(a)尝试使用带有Dictionary^
的C ++ range-for循环,以及(b)尝试将系统类型与C ++标准类型互换使用。所有这些都没有奏效。
您需要更多地执行此操作:使用Dictionary^
迭代for each
集合,将String ^转换为std :: wstring properly,并创建使用std::make_pair
映射项目。
所以你的功能看起来像这样(未经测试)
std::map <std::wstring, std::map<int, int>> Convert(Dictionary<String ^, Dictionary<int, int>^> ^myMap)
{
std::map <std::wstring, std::map<int, int>> h_result;
// iterate the outer dictionary
for each(KeyValuePair<String ^, Dictionary<int, int>^> ^kvp1 in myMap)
{
std::wstring stringKey = marshal_as<std::wstring>(kvp1->Key);
std::map<int, int> mapValues;
// iterate the inner dictionary
for each(KeyValuePair<int, int> ^kvp2 in kvp1->Value)
{
// insert in inner map
mapValues.insert(std::make_pair(kvp2->Key, kvp2->Value));
}
// insert in outer map
h_result.insert(std::make_pair(stringKey, mapValues));
}
return h_result;
}