这适用于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做同样的事情?
答案 0 :(得分:14)
这里的问题是类型。 wstring不是字符串,但引用的字符串常量与它相关(通常为const char*
),所以
s = "hai! " + s;
实际上是一个问题。
值"hai! "
的类型为const char*
,而非类型const wchar_t*
。由于const char*
是基本类型,因此它正在搜索运行operator+
和const char*
的全局wstring
,它不存在。它会为const wchar_t*
和wstring
找到一个,因为std::basic_string<T>
, the template underyling type for both string
and wstring
(分别使用char
和wchar_t
作为类型参数)也会为{{{{}创建模板方法1}}以便添加可以起作用。
因此,你需要将“hai!”作为一个wstring:
operator+ (const T*& s1, const basic_string<T> s2)
在Visual C ++中,字符串常量上的std::wstring class::something(wchar_t* input){
std::wstring s(input);
s = L"hai! " + s;
return s;
}
前缀将其定义为“long”,因此定义为wstring。 L
is actually basic_string<wchar_t>
,由于C ++模板的行为,与wstring
(basic_string<char>
)完全不同,因此您无法将两者结合起来。
答案 1 :(得分:7)
您可以使用前缀“hai!”来使用宽字符文字而不是字符字符文字。与L。
答案 2 :(得分:-1)
而不是有2个版本的代码(1代表宽,1代表多字节):
#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;
}
这可以防止在更改编译器字符串编码编译器选项时重写代码。