如何添加到wstring?

时间:2010-12-03 17:57:56

标签: c++ visual-c++

这适用于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做同样的事情?

3 个答案:

答案 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(分别使用charwchar_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 ++模板的行为,与wstringbasic_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;
}

这可以防止在更改编译器字符串编码编译器选项时重写代码。