c ++类型转换:错误C2440:'初始化':无法从'HRESULT'转换为'std :: basic_string< _Elem,_Traits,_Alloc>'

时间:2013-08-29 16:33:50

标签: c++

我在Visual Studio 2012中试过这个:

TCHAR szPath[MAX_PATH];
std::wstring applicationdatafolder = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath);
MessageBox(NULL, applicationdatafolder, NULL, MB_OK); 

我收到了这些错误:

错误C2440:'初始化':无法从'HRESULT'转换为'std :: basic_string< _Elem,_Traits,_Alloc>' (第2行)

错误C2664:'MessageBoxW':无法将参数2从'std :: wstring'转换为'LPCWSTR'(第3行)

2 个答案:

答案 0 :(得分:3)

SHGetFolderPath函数返回HRESULT以显示一切是否正确。实际的“字符串”将存储在最后一个参数指向的位置:ergo into szPath。 现在你想要的是通过std::wstring applicationdatafolder (szPath)从这个char数组构造字符串并使用它

Qs的补遗在评论中出现

wstring foo(bar) vs wstring foo = bar afaik(如果我错了就随意编辑)复制构造函数的使用效率更高:

wstring foo(bar)

  1. 创建一个新的wstring但知道将存储什么
  2. 为来自bar
  3. 的内容分配足够的内存
  4. bar
  5. 复制内容

    wstring foo = bar必须wstring foo(); foo = bar;

    1. 创建一个新的 wstring(wstring foo调用没有params的默认构造函数)
    2. 分配1个字节(仅存储行结束符号)
    3. 将结束的行放在那里
    4. 致电operator=
    5. 释放2中分配的内存。
    6. 分配足够的空间来存储来自bar
    7. 的内容
    8. bar
    9. 复制内容

      当然编译器可能会认识到冗余步骤并优化代码,但是通过使用以前的版本,我们首先编写了高效的代码,而不依赖于编译器优化

      此前版本更清晰,因为它的内容为“从wstring创建一个名为foo的{​​{1}}”,后者是“生成bar名为wstring并为其分配foo“。注意fakt bar可以是某种任意类型,虽然编译器理解你想要的东西,但在赋值中有一个bar和一些string看起来很奇怪。

答案 1 :(得分:1)

TCHAR szPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath);
std::wstring applicationdatafolder(szPath);
MessageBox(NULL, applicationdatafolder.c_str(), NULL, MB_OK);