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> 无构造函数可以接受源类型,或构造函数重载决策不明确

请大神指教,谢谢

参考技术A string是C++字符串
CString是MFC字符串
两者没有默认转换追问

问题已经解决,需要在:项目-项目属性——配置属性——常规——项目默认值——字符集里面改为”使用多字节字符集“。
谢谢各位了

本回答被提问者采纳
参考技术B 把(const string)去掉看看。追问

去掉没用的呢……

追答

去掉后报什么错?

追问

谢谢,问题已经解决,我已附上答案

我无法将 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 *”

在 C++ 中将 long 转换为 CString

VS 2010 中的 C++ 中的 static_cast 无法从 void* 转换为 size_t 错误

由于从 C 到 C++ 的类型转换,无法编译并出现错误 C2440

如何在 C++ 中将 Cstring 转换为 TCHAR*?

C++ 无法从枚举转换为 LPCTSTR [关闭]