c++中出现 无法从“CString”转换为“const std::string”错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中出现 无法从“CString”转换为“const std::string”错误相关的知识,希望对你有一定的参考价值。
CString szFilterFDlg =_T("视频文件 (*.avi;*.mov;*.mpeg;*.mpg;*.rmvb;*.mp4;*.wmv)|*.avi;*.mov;*.mpeg;*.mpg;*.rmvb;*.mp4;*.wmv||");
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilterFDlg); //打开视频文件
CString bluePathName; //此处不能在if里面定义,否则有可能得不到路径
if ( dlg.DoModal()==IDOK )
bluePathName=dlg.GetPathName();
if(blueVideoCapture.isOpened()) //如果现在已经加载了视频,则需要将其释放
blueVideoCapture.release();
blueVideoCapture.open((const string)bluePathName); //open(const string& filename)->为输入的引用
出现错误为:blueVideoCapture.open((const string)bluePathName);
提示错误为:error C2440: “类型转换”: 无法从“CString”转换为“const std::string”
1> 无构造函数可以接受源类型,或构造函数重载决策不明确
请大神指教,谢谢
CString是MFC字符串
两者没有默认转换追问
问题已经解决,需要在:项目-项目属性——配置属性——常规——项目默认值——字符集里面改为”使用多字节字符集“。
谢谢各位了
去掉没用的呢……
追答去掉后报什么错?
追问谢谢,问题已经解决,我已附上答案
我无法将 cstring 转换为 int
【中文标题】我无法将 cstring 转换为 int【英文标题】:I can't convert cstring to int 【发布时间】:2012-07-30 19:11:48 【问题描述】:我想从 cstring 中获取 int。 这是代码。
CStringArray paramArray;
paramArray.Add((LPCSTR)"5");
paramArray.Add((LPCTSTR)"151");
pvarArguments = new CComVariant[2];
pvarArguments[0] = (LPCTSTR)paramArray[1];
CString str;
str = (CStringA)pvarArguments[0];
int nlen = _wtoi(str.GetBuffer());
当我运行我的程序时,我总是得到值 0,我不明白为什么会这样。 请帮帮我。
【问题讨论】:
你确定paramArray[1]
持有你的CString
吗?从你发布的截图来看,我希望它是paramArray[0]
。
您是否定义了UNICODE
?如果不是 LPCTSTR
只是一个 char*
和 _wtoi
将不适合调用
哦,我很抱歉我的错误。 Codde一定是这样的。 paramArray.Add((LPCSTR)"5");; paramArray.add(((LPCSTR)"151"); 和ohher代码是一样的
@bTagTiger 请使用此新信息而不是评论来编辑您的问题。
【参考方案1】:
来自TFM(强调我的):
每个函数都返回通过解释输入产生的 int 值 字符作为数字。 atoi 和 _wtoi 的返回值为 0,如果 输入无法转换为该类型的值。
打印字符串或使用调试器检查它。字符串中可能存在无效(包括不可打印)字符。
【讨论】:
我建议打印或查看字符串每个字符的字节值,而不是依赖调试器或打印,因为正如您所说,在某些情况下可能不会显示无效字符。 【参考方案2】:很难说你想做什么。你知道 C++ 数组是从 0 开始的,对吧?我问是因为这行代码:
pvarArguments[0] = (LPCTSTR)paramArray[1];
完全搞砸了。我不明白为什么在尝试索引 CStringArray 中等于元素计数的元素时它不会引发异常。您只能索引到 count-1 ==>>,在这种情况下为“0”。
你的 pvarArguments[0] 里面会有垃圾——我不知道为什么没有抛出异常。
如果你想从一个变体中得到一个不同的类型,你可以使用 VariantChangeType() 并且不要与 wcstoi 或 atoi 混淆。如果失败,它会给出一个错误代码,而不是只返回 0。如果你一心想要在 CString 上使用 wcstoi 或 atoi,请使用 _tstoi(),无论你是否定义了 UNICODE,它都有效。
【讨论】:
它是 C++。超出索引数组的范围,恶魔可能会飞出你的鼻子......或者你会崩溃......或者你会得到碰巧超过内存中数组的随机垃圾。 编辑: 糟糕,这是一个 MFC 集合。我不知道当你做一些愚蠢的事情时这些是否应该抛出异常。【参考方案3】:CStringA
表示需要 atoi
而不是 _wtoi
的 ANSI 字符串类型。
我建议:
CString str(pvarArguments[0]);
int nlen = atoi(str.GetString());
GetBuffer()
并不理想,因为您必须记得稍后再使用ReleaseBuffer()
。
编辑:根据新信息,试试这个:
paramArray.Add(L"5");
paramArray.Add(L"151");
L macro 可以识别字符串 wchar_t。如果 L 不起作用,请尝试 _T
。然后使用_wtoi
或_tstoi
。
【讨论】:
当我将此代码插入到我的项目中时,出现错误“无法将参数 1 从 const wchar_t * 转换为 const char*。所以我将函数名称更改为 _wtoi,而不是 atoi。但错误是一样。值为0。 @bTagTiger 您看到我对答案的修改了吗?L
宏对您有用吗?【参考方案4】:
CStringArray paramArray;
paramArray.Add(_T("5"));
paramArray.Add(_T("151"));
CComVariant *pvarArguments = new CComVariant[2];
pvarArguments[0] = (LPCTSTR)paramArray[1];
CString str;
str = pvarArguments[0].bstrVal;
int nlen = _ttoi(LPCTSTR(str));
【讨论】:
【参考方案5】:根据上面的建议,这是为我编译的:
rs->GetFieldValueString(0).Left(1) == sBoroCode
&& (_ttoi(LPCTSTR(sLowHouseNo)) % 2) == (_ttoi(LPCTSTR(rs->GetFieldValueString(2))) % 2)
【讨论】:
以上是关于c++中出现 无法从“CString”转换为“const std::string”错误的主要内容,如果未能解决你的问题,请参考以下文章
VS2008 C++中 inet_addr()函数用法。 inet_addr: 不能将参数 1 从“CString”转换为“const char *”
VS 2010 中的 C++ 中的 static_cast 无法从 void* 转换为 size_t 错误
由于从 C 到 C++ 的类型转换,无法编译并出现错误 C2440