Я пытаюсь cout a basic_string<TCHAR>
. Но cout бросает ошибку. Могу ли я знать, как это сделать
Как отключить std:: basic_string <TCHAR>
Ответ 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
}