Подтвердить что ты не робот

Как отключить std:: basic_string <TCHAR>

Я пытаюсь cout a basic_string<TCHAR>. Но cout бросает ошибку. Могу ли я знать, как это сделать

4b9b3361

Ответ 1

Как сказал дофик, std::wcout для широких строк и std::cout для узких. Если вы хотите иметь возможность компилировать для любого типа строки (TCHAR предназначен для упрощения этого типа), что-то вроде этого иногда облегчает жизнь:

#if defined(UNICODE) || defined(_UNICODE)
#define tcout std::wcout
#else
#define tcout std::cout
#endif

Вместо этого вместо этого используйте tcout.

Ответ 2

TCHAR - это определение winapi для типа символа, используемого вашим приложением. Если у вас есть символ, заданный как многобайтовые символы, это будет char. Если у вас установлен Unicode, это будет wchar_t.

Если это wchar_t, вам нужно использовать std::wcout. В противном случае просто std::cout должно быть в порядке.

Как правило, это помогает также объяснить, какие ошибки вы получаете, но, скорее всего, вы пытаетесь вставить std::basic_string<wchar_t> в std::cout, и, вероятно, для этого не существует перегрузки operator<<.

Ответ 3

Как отметил @Bo Persson, другим способом определения типа tcout будет использование ссылок с правильными типами потоков. Хотя при этом нужно учитывать еще несколько вещей, так как вы легко столкнетесь с проблемами компоновщика из-за множества или отсутствующих определений.

Что для меня работает, это объявлять эти типы в качестве внешних ссылок в заголовке и определять их один раз в исходном файле. Это также работает в предварительно скомпилированном заголовке (stdafx).

Заголовок

namespace std
{
#ifdef UNICODE
    extern wostream& tcout;
#else
    extern ostream& tcout;
#endif // UNICODE
}

Реализация

namespace std
{
#ifdef UNICODE
    wostream& tcout = wcout;
#else
    ostream& tcout = cout;
#endif // UNICODE
}