2016-11-22 8 views
1

これを動作させるにはどうすればよいですか? C++のタイプは本当に混乱しています。const 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(); 
迷惑をおかけして申し訳ありません

を。

関連する問題