Ошибка, связанная с заголовками и пространствами имен при переходе с C ++ / CX на C ++ / WinRT - PullRequest
1 голос
/ 05 августа 2020

File.h:

std::map<winrt::hstring, winrt::hstring> someMap;

File. cpp

auto it = someMap.find(someKey);
if (it != someMap.end()) {
    it.second += (winrt::hstring{L", "} + someString.c_str());
}

Я получаю следующую ошибку:

'second': is not a member of 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>'
    with
    [
        _Ty=std::pair<winrt::hstring,winrt::hstring>
    ]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\include\xtree(778): note: see declaration of 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>'
    with
    [
        _Ty=std::pair<winrt::hstring,winrt::hstring>
    ]

Я знаю из здесь , что нужно включить заголовки каждого пространства имен, которое мы используем. Я предполагаю, что эта ошибка оттуда, и, возможно, поэтому Visual Studio не может разрешить поиск из std :: map и вместо этого сопоставляется с поиском из xtree.h. Но могу ошибаться. Я попытался включить std в качестве пространства имен, но это не работает или, по крайней мере, мне может понадобиться что-то в дополнение к этому. Какие заголовки и / или пространства имен я должен включить для устранения этой ошибки.

1 Ответ

2 голосов
/ 05 августа 2020

std :: map :: find возвращает итератор. Итератор не имеет членов first или second, в отличие от фактических элементов карты. Если вы хотите получить доступ к элементу, вам необходимо разыменовать итератор, используя операторы * или ->:

auto it = someMap.find(someKey);
if (it != someMap.end()) {
    it->second += (winrt::hstring{L", "} + someString.c_str());
}
...