2013-08-29 33 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

相關問題