views:

2393

answers:

6

I have:

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));

The error: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

What's the correct way to cast here in C++ style?

+12  A: 

reinterpret_cast

Ruben Bartelink
A: 

You would need to use a reinterpret_cast<> as the two types you are casting between are unrelated to each other.

Timo Geusch
A: 

Try reinterpret_cast

usigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
JaredPar
+3  A: 

char * and const unsigned char * are considered unrelated types. So you want to use reinterpret_cast.

But if you were going from const unsigned char* to a non const type you'd need to use const_cast first. reinterpret_cast cannot cast away a const or volatile qualification.

Brian R. Bondy
A: 

By the way if you work under Visual Studio, then you can force compiler to treat char as unsigned char. Project settings | C/C++ Settings | Language | Default Char Unsigned ;-)

Dominic.wig
A: 

unsigned char* is basically a byte array and should be used to represent raw data rather than a string generally. A unicode string would be represented as wchar_t*

According to the C++ standard a reinterpret_cast between unsigned char* and char* is safe as they are the same size and have the same construction and constraints. I try to avoid reintrepret_cast even more so than const_cast in general.

If static cast fails with what you are doing you may want to reconsider your design because frankly if you are using C++ you may want to take advantage of what the "plus plus" part offers and use string classes and STL (aka std::basic_string might work better for you)

AJG