看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《carl71321 (Christopher)》之銘言: : ( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) : ( 未必需要依照此格式,文章條理清楚即可 ) : 遇到的問題: (題意請描述清楚) : 宣告了一函數如下,如果把visual studio : 內專案的字元集設定設定成UNICODE,編譯後即會出現 : 錯誤 1 error C2664: ' : std::basic_string<_Elem,_Traits,_Ax> : &std::basic_string<_Elem,_Traits,_Ax>:: : append(const std::basic_string<_Elem,_Traits,_Ax> &)' : : 無法將參數 1 從 'LPCTSTR' 轉換成 : 'const std::basic_string<_Elem,_Traits,_Ax> &' : 但如使用多位元組字元集,即能夠正確的編譯,請問這是什麼呢? : 先謝謝大家的幫忙。 : string MakeGlobalName(LPCTSTR lpsName) { : string ret; : ret = GN_ROOT; : ret.append(lpsName); : return ret; : }; : 使用的平台為visual studio 2008 win32主控台應用程式。 因為 LPCTSTR (其實所有 TCHAR 系列的東西都一樣) 會根據你是 UNICODE 還是 MBCS 來決定是替換成 wchar_t 還是 char. std::string 其實是 std::basic_string<char> 在 UNICODE 的環境裡面,你的 method 其實是: basic_string<char> MakeGlobalName(wchar_t* lpsName) { basic_string<char> ret; ret = GN_ROOT; // 我猜 GN_ROOT 也是 LPCTSTR 吧? // 即是也是 wchar_t* ret.append(lpsName); return ret; } ret expect 的是 char, 你傳的東西是 wchar_t, 當然出問題了。 解決方法之一就是讓 ret 也會根據 UNICODE/MCBS 來變成適當 的 type: basic_string<TCHAR> MakeGlobalName(LPCTSTR name) { basic_string<TCHAR> ret; : : } (忘了 VC++ 有沒有提供方便的 macro 替換 basic_string<TCHAR> 了) 解決方法二就是... 只 support UNICODE, 東西也通通直接寫 UNICODE 的版本(wchar_t, std::wstring etc).... :P -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.79.103.239 ※ 編輯: adrianshum 來自: 219.79.103.239 (02/15 11:12)
carl71321:GNROOT使用下述指令定義 02/15 12:18
carl71321:#define GN_ROOT "Global\\" 02/15 12:18
carl71321:覺得奇怪的地方就是為什麼使用多位元組字元集後,string 02/15 12:21
carl71321:就能去接LPCTSTR 02/15 12:24
carl71321:此時的string不是std::basic_string<char>嗎? 02/15 12:25
carl71321:謝謝你的回答 02/15 12:25
adrianshum:因為 MBCS 底下,TCHAR 就單純是 char 而已,一切都是 02/15 13:24
adrianshum:char (LPTCSTR = char*, string = basic_string<char>) 02/15 13:25
adrianshum:所以當然沒問題 02/15 13:25
adrianshum:btw, 恐怕 GN_ROOT 也可能有問題 (不太肯定) 02/15 13:26