赞
踩
据说是由于从VC++6.0升级过来的代码,因为它的工程默认设置是非Unicode的,而vs2010工程的默认配置是Unicode的,所以在vs2010重写以前的代码的时候难免会出现这样以及那样 的问题,尤其是关于字符的问题。比如说:m_CityName.SetWindowTextA(city[t].c_str());(声明CStatic m_CityName,vector<string>city)出现的错误为: error C2039: “SetWindowTextA”: 不是“CStatic”的成员
和 m_List.AddString(city_name.c_str());出现的错误为:error C2664: “CListBox::AddString”: 不能将参数 1 从“const char *”转换为“LPCTSTR”!
还有 city.push_back(city_name.GetBuffer());出现的错误为: error C2664: “void std::vector<_Ty>::push_back(_Ty &&)”: 不能将参数 1 从“wchar_t *”转换为“std::string &&”
以及 对于出现“**”的字符串会出现错误:error:"const char *"类型的实参与"LPCTSTR"类型的形参不兼容
解决方法:方法1:最简单的方法就是通过设置vs2010的工程的通用属性的常规的字符集设置成“使用多字节字符集”就可以啦!
方法2:方法1虽然好,但是鉴于与时俱进以及与其它平台对接的原因,最好还是不改变vs2010的字符集。那么久需要修改具体的代码了。
一,对于m_CityName.SetWindowTextA(city[t].c_str()) 将其更改为 SetWindowTextA(m_CityName.m_hWnd,city[t].c_str());不知其所以然;
二,对于 m_List.AddString(city_name.c_str())将其改为USES_CONVERSION; m_List.AddString(A2CW(city_name.c_str()));也不知其所以然;
三,city.push_back(city_name.GetBuffer())将其改为: USES_CONVERSION; city.push_back(W2A(city_name.GetBuffer()));原因与第四个一样。
四,对于字符串不兼容的,可以将"**"修改为:_T("**"); 原因与第三个一样,是ANSII的CString的默认是窄字节的,而Unicode是宽字节的,_T在ANSI编译下表示ANSI串,在UNICODE下表示UNICODE串。在UNICODE下我们需要做宽窄字节的转换,比如:
USES_CONVERSION;
CString str;
std::string str1 = W2A(str.Getbuffer());
str.ReleaseBuffer();
2015.09.17更
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。