Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cout the std::basic_string<TCHAR>

I am trying to cout a basic_string<TCHAR>. But cout is throwing error. Can I know how to do that

like image 340
prabhakaran Avatar asked Mar 02 '11 08:03

prabhakaran


3 Answers

As dauphic said, std::wcout is for wide strings and std::cout for narrow ones. If you want to be able to compile for either type of string (TCHAR is meant to make this sort of thing easier) something like this sometimes makes life easier:

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

With this in place use tcout instead.

like image 105
Steve Avatar answered Nov 07 '22 05:11

Steve


TCHAR is a winapi define for the character type used by your application. If you have the character set as multi-byte characters, it will be char. If you have it set to Unicode, it will be wchar_t.

If it's wchar_t, you need to use std::wcout. Otherwise, just plain std::cout should be fine.

Generally it helps to also explain what errors you're getting, but most likely you're trying to insert an std::basic_string<wchar_t> into std::cout, and there probably isn't an operator<< overload for that.

like image 21
Collin Dauphinee Avatar answered Nov 07 '22 03:11

Collin Dauphinee


As @Bo Persson mentioned, another way of defining a tcout type would be using references with the correct stream types. Though there are a few more things to consider when doing that, as you'll easily end up with linker issues due to multiple or missing definitions.

What works for me is declaring these types as external references in a header and defining them once in a source file. This also works in a precompiled header (stdafx).

Header

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

Implementation

namespace std
{
#ifdef UNICODE
    wostream& tcout = wcout;
#else
    ostream& tcout = cout;
#endif // UNICODE
}
like image 3
Vinz Avatar answered Nov 07 '22 04:11

Vinz