这适用于std::string
std::string class::something(char* input) {
std::string s(input);
s = "hai! " + s;
return s;
}但如果我尝试对wstring执行相同的操作,则会失败
std::wstring class::something(wchar_t* input) {
std::wstring s(input);
s = "hai! " + s;
return s;
}我如何用std::wstring做同样的事情呢?
发布于 2010-12-04 02:06:42
这里的问题是类型。wstring不是字符串,但是带引号的字符串常量与它相关(它通常是一个const char*),因此
s = "hai! " + s;实际上是一个问题。
值"hai! "的类型为const char*,而不是const wchar_t*。因为const char*是一个基本类型,所以它正在搜索一个操作const char*和wstring的全局operator+,而这个and并不存在。它将为const wchar_t*和wstring找到一个模板方法,因为std::basic_string, the template underyling type for both string and wstring (分别使用char和wchar_t作为类型参数)还为operator+ (const T*& s1, const basic_string<T> s2)创建了模板方法,以便可以进行添加。
因此,你需要做"hai!“一个wstring:
std::wstring class::something(wchar_t* input){
std::wstring s(input);
s = L"hai! " + s;
return s;
}在Visual C++中,字符串常量的L前缀将其定义为"long",因此是一个wstring。wstring is actually basic_string,由于C++模板的行为,它是与basic_string<char> ( std::string)完全不同的类型,所以您不能将两者组合在一起。
发布于 2010-12-04 01:59:31
通过添加前缀"hai!“,您可以使用宽字符文字而不是字符文字。与L.
发布于 2010-12-04 03:26:43
而不是有两个版本的代码(一个用于宽字节,一个用于多字节):
#ifdef _UNICODE
typedef std::wstring tstring;
typedef wchar_t tchar;
# define TEXT(s) L##s
#else
typedef std::string tstring;
typedef char tchar;
# define TEXT(s) s
#endif
tstring class::something(tchar* input)
{
tstring s(input);
s = TEXT("hai! ") + s;
return s;
}这可避免在更改编译器字符串编码编译器选项时重写代码。
https://stackoverflow.com/questions/4348392
复制相似问题