2016-11-22 106 views
1

如何使其工作? C++類型真的讓人困惑:將常量wchar_t *轉換爲WCHAR *

std::wstring wquery = std::wstring(query.begin(), query.end()); 
//split names 
std::vector<WCHAR*> split_names; 
std::stringstream ss; 
ss.str(names); 
std::string name; 
while (std::getline(ss, name, ',')) { 
    split_names.push_back(
     (
      std::wstring(
       name.begin(), 
       name.end() 
      ) 
     ).c_str() 
    ); //error can't assign const wchar_t* into WCHAR* 
} 
+0

什麼是查詢在這裏?請提供[MCVE](http://stackoverflow.com/help/mcve) – wasthishelpful

+0

它們不相等? –

+0

你爲什麼使用'WCHAR',以及它是如何定義的。 –

回答

2

C++試圖讓你免於錯誤。這裏:

std::wstring(name.begin(), name.end())).c_str() 

你創建一個臨時對象std::wstring並獲得指向字符串內容的指針。在你離開這個區塊之後,物體將被立即銷燬。結果你會得到一個無效的指針。

不要將指向臨時對象的指針存入std::vector<WCHAR*> split_names;

+1

不,它可能是因爲它不是'vector ' –

+0

使用'wcsdup(... .c_str())'是一個選項,只是不是一個好的選擇。 – kay

+0

@appleapple是對的,檢測到的錯誤不是未來的UB。 –

0

我解決了它改寫一切:

//split names 
       std::vector<std::wstring> split_names; 
       std::stringstream ss; 
       ss.str(names); 
       std::string name; 
       while (std::getline(ss, name, ',')) { 
        split_names.push_back(std::wstring(name.begin(), name.end())); 
       } 

       std::vector<const WCHAR*> pszTags; 
       pszTags.resize(split_names.size()); 
       for (int i = 0; i < pszTags.size(); i++) 
        pszTags[i] = split_names[i].c_str(); 

很抱歉給您帶來不便。