#c 11
Вопрос:
Я хочу использовать следующий код:
wstring s = L"GetLockCount " g_SpeakerAlias.c_str();
MessageBoxW(NULL, unsignedinttowstring(iLockCount).c_str(), s, MB_OK);
Компилятор говорит мне:
The expression must have an integer enumeration type or an enumeration type without range restriction
То, как я пытаюсь соединить 2 струны, кажется неправильным:
L"GetLockCount " g_SpeakerAlias.c_str()
Вот декларация:
wstring g_SpeakerAlias=L"SomeName";
Комментарии:
1. Обратите внимание, что вместо
unsignedinttowstring
этого вы можете использоватьstd::to_wstring
Ответ №1:
.c_str() не является необходимым для объединения. Вам это нужно только в MessageBoxW, так как он ожидает LPCWSTR.
Это правильно:
wstring s = L"GetLockCount " g_SpeakerAlias;
MessageBoxW(NULL, unsignedinttowstring(iLockCount).c_str(), s.c_str(), MB_OK);
Чтобы быть ясным, причина, по которой это работает, заключается в том, что, хотя L»GetLockCount» не является строкой wstring (это строковый литерал в стиле C с широким символом, который не является строкой C ), g_SpeakerAlias является строкой wstring, и для оператора существует перегрузка, где левая сторона-это wchar_t*, а правая-это строка wstring, которая создает другую строку wstring. При вызове .c_str () происходит сбой, потому что нет перегрузки, покрывающей wchar_t* wchar_t*. Другим решением было бы выполнить wstring s = L»GetLockCount «;, затем продолжить с помощью s = g_SpeakerAlias;; wstring строит из литерала, затем объединяет.
Комментарии:
1. Чтобы было ясно, причина, по которой это работает, заключается в том, что , хотя
L"GetLockCount "
это не awstring
(это широкосимвольный строковый литерал в стиле C, который не является Cwstring
),g_SpeakerAlias
это awstring
, и существует перегрузка дляoperator
того, где левая сторона-awchar_t*
, а правая-awstring
, которая создает другуюwstring
. Когда вы звоните.c_str()
, он выходит из строя, потому что нет покрытия перегрузкиwchar_t* wchar_t*
. Другим решением было бы сделатьwstring s = L"GetLockCount ";
,s = g_SpeakerAlias;
аwstring
затем продолжить ; конструкции из буквального, а затем объединить.2. @ShadowRanger, Вы позволите мне вставить ваш комментарий в мой ответ? Или, если нет, вы можете с радостью опубликовать свой комментарий в качестве ответа.
3. Продолжайте и добавьте его. Сохраняйте то, что вам нравится, перефразируйте, что угодно; важная часть заключается в том, что ОП знает, почему это не сработало и почему изменение заставляет его работать, чтобы в будущем они могли решить проблему логикой, а не программированием культа карго.