簡體   English   中英

C ++類型轉換:錯誤C2440:“正在初始化”:無法從“ HRESULT”轉換為“ std :: basic_string <_Elem,_Traits,_Alloc>”

[英]c++ type conversion: error C2440: 'initializing' : cannot convert from 'HRESULT' to 'std::basic_string<_Elem,_Traits,_Alloc>'

我在Visual Studios 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>”(第二行)

錯誤C2664:“ MessageBoxW”:無法將參數2從“ std :: wstring”轉換為“ LPCWSTR”(第3行)

SHGetFolderPath函數確實返回一個HRESULT以顯示一切是否正確。 實際的“字符串”將存儲在最后一個參數指向的位置:ergo到szPath 現在,您想要的是通過std::wstring applicationdatafolder (szPath)從此char數組構造字符串並使用它

Q的附錄出現在評論中

wstring foo(bar) VS wstring foo = bar據我所知(隨意編輯,如果我錯了)的拷貝構造函數的使用更有效:

wstring foo(bar)

  1. 創建一個新的wstring但知道將存儲什么
  2. bar內容分配足夠的內存
  3. bar復制內容

wstring foo = bar是必需的wstring foo(); foo = bar; wstring foo(); foo = bar;

  1. 創建一個新的 wstring( wstring foo調用不帶參數的默認構造函數)
  2. 分配1個字節(僅存儲行尾符號)
  3. 將行結束
  4. 致電operator=
  5. 釋放在2中分配的內存。
  6. 分配足夠的空間來存儲bar內容
  7. bar復制內容

當然,編譯器可能會識別冗余的步驟,優化代碼,但通過使用以前版本中,我們寫在第一位高效的代碼,不依賴於編譯器optimiziation

同樣,前一個版本的含義更為清晰,因為其讀為“從bar創建一個名為foowstring ”,而后者為“創建一個名為foowstring並為其分配bar ”。 注意fakt bar可以是任意類型,盡管編譯器了解您想要的內容,但在賦值中包含string和某些mywierdtype看起來似乎很奇怪。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM