2013-08-29 67 views
-1

我在视觉工作室2012尝试这样做:C++类型转换:错误C2440:初始化:不能从 'HRESULT' 转换到 '的std :: basic_string的<_Elem,_Traits,_Alloc>'

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>'(第二行)

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

回答

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); 
+0

在C++语法背后有什么想法:“std :: wstring applicationdatafolder(szPath)” – user2726531

+0

它是一个带参数的构造函数 – user1233963

+0

'applicationdatafolder'如何处理'szPath'?它实际上对'szPath'做了什么? – user2726531

3

SHGetFolderPath功能返回HRESULT显示是否一切正常。实际的“字符串”将存储在最后一个参数指向的地方:ergo到szPath。 现在,你想要的是通过std::wstring applicationdatafolder (szPath)构建从这个字符数组的字符串,并使用它

编为Qs进行评论出现

wstring foo(bar) VS wstring foo = bar 据我所知(随时免费的,如果我错了,以编辑)拷贝构造函数的使用更加高效:

wstring foo(bar)

  1. 创建一个新的wstring但知道会被储存
  2. 分配从bar
  3. 副本内容的内容足够的内存从bar

wstring foo = bar是essentialy wstring foo(); foo = bar;

  1. 创建一个新的 wstring(wstring foo调用没有参数的默认构造函数)
  2. 分配1个字节(仅行结束符将被存储)
  3. 地方没有结束,
  4. 电话operator=
  5. 行释放了在2
  6. 分配的内存分配足够的地方来存储内容从bar
  7. 副本从bar

内容课程的编译器可能会识别冗余的步骤和优化的C颂歌,但使用前版本中,我们写在第一位高效的代码,并且不依赖于编译器optimiziation

也是前的版本是它的内容更为清楚“做一个wstring命名从barfoo”和后者“制作一个名为foowstring并将其分配bar”。注意fakt bar可以是一些任意类型,虽然编译器能理解你想要的东西,但在分配中有string和一些mywierdtype可能看起来很奇怪。

+0

C++语法对我来说有点混乱......'applicationdatafolder'看起来不像一个函数。如何在'applicationdatafolder'不是函数时传递'szPath'? – user2726531

+0

'someType myVariable(someStuff)'将调用'someType'的**构造函数**。 – Valerij

+0

'applicationdatafolder'如何处理'szPath'?它实际上对'szPath'做了什么? – user2726531

相关问题