2016-11-22 72 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(); 

很抱歉给您带来不便。