2015-02-20 2 views
2

Я в процессе переноса некоторого кода из Visual studio в mingw gcc. Я наткнулся на это заявлениеporting std :: wstring from visual studio to mingw gcc

if (mnode.GetTag() == _T("val"))  
     return true; 

это определение метода GetTag()

const std::wstring &GetTag() const; 

Я получаю ошибку

error: no matching function for call to 'std::basic_string<wchar_t>::basic_string(const char [6])'| 

Теперь после прочтения this Я до сих пор не уверен, как решить эту проблему. Любые предложения о том, почему эта ошибка отображается? это из-за wstring?

+0

Что такое макрос '_T()', определенный при создании с использованием MinGW? – Praetorian

+0

@Praetorian, По моему опыту, MinGW эмулирует большинство материалов MSVC для использования Winapi. – chris

+0

такой же, как в визуальной студии. Он использует #define _T (x) __T (x) –

ответ

5

Похоже, ваша проблема в том, что макрос препроцессора _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.

 Смежные вопросы

  • Нет связанных вопросов^_^