首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何添加到wstring?

如何添加到wstring?
EN

Stack Overflow用户
提问于 2010-12-04 01:57:56
回答 3查看 23.6K关注 0票数 10

这适用于std::string

代码语言:javascript
复制
std::string class::something(char* input) {
    std::string s(input);
    s = "hai! " + s;
    return s;
}

但如果我尝试对wstring执行相同的操作,则会失败

代码语言:javascript
复制
std::wstring class::something(wchar_t* input) {
    std::wstring s(input);
    s = "hai! " + s;
    return s;
}

我如何用std::wstring做同样的事情呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-04 02:06:42

这里的问题是类型。wstring不是字符串,但是带引号的字符串常量与它相关(它通常是一个const char*),因此

代码语言:javascript
复制
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 (分别使用charwchar_t作为类型参数)还为operator+ (const T*& s1, const basic_string<T> s2)创建了模板方法,以便可以进行添加。

因此,你需要做"hai!“一个wstring:

代码语言:javascript
复制
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)完全不同的类型,所以您不能将两者组合在一起。

票数 16
EN

Stack Overflow用户

发布于 2010-12-04 01:59:31

通过添加前缀"hai!“,您可以使用宽字符文字而不是字符文字。与L.

票数 8
EN

Stack Overflow用户

发布于 2010-12-04 03:26:43

而不是有两个版本的代码(一个用于宽字节,一个用于多字节):

代码语言:javascript
复制
#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;
}

这可避免在更改编译器字符串编码编译器选项时重写代码。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4348392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档