Похоже, ваша проблема в том, что макрос препроцессора _UNICODE
не определен. MSDN explains Как это влияет на строковый литерал, заключенный в макрос _T()
.
pWnd->SetWindowText(_T("Hello"));
С _UNICODE
определенной, _T
переводит буквальную строку в L
-prefixed формы; в противном случае _T
переводит строку без префикса L
.
Добавление L
префикса к строке буквального указывает на то, что это wide string literal и std::wstring
(или std::basic_string<wchar_t>
) определяет operator==
перегрузку, которая принимает аргумент wchar_t const *
, таким образом, позволяя код для компиляции.
Помните, что макрос UNICODE
подходит, если вы собираетесь вызывать функции в Windows API. Раймонд Чен прекрасно объясняет безумие в this post.
Итак, одним из способов исправить вашу проблему является добавление символов препроцессора _UNICODE
и UNICODE
в командную строку gcc.
Но не делайте этого! Это мое мнение по этому вопросу — вместо того, чтобы в зависимости от неясных макросов просто префикс строкового литерала с L
вручную. Особенно в этом случае, поскольку вы говорите, что GetTag()
всегда возвращает wstring const&
, я бы сказал, используя макрос _T()
для этого строкового литерала.
В противном случае при вызове функций Windows API просто вызовите расширенную версию символа. Например, замените вызовы на GetWindowText
на GetWindowTextW
.
Что такое макрос '_T()', определенный при создании с использованием MinGW? – Praetorian
@Praetorian, По моему опыту, MinGW эмулирует большинство материалов MSVC для использования Winapi. – chris
такой же, как в визуальной студии. Он использует #define _T (x) __T (x) –