Il codice seguente viene compilato in Visual Studio 2010 ma non riesce a compilare in Visual Studio 2012 RC.Errore di compilazione C++ in Visual Studio 2012: LPCWSTR e wstring
#include <string>
// Windows stuffs
typedef __nullterminated const wchar_t *LPCWSTR;
class CTestObj {
public:
CTestObj() {m_tmp = L"default";};
operator LPCWSTR() { return m_tmp.c_str(); } // returns const wchar_t*
operator std::wstring() const { return m_tmp; } // returns std::wstring
protected:
std::wstring m_tmp;
};
int _tmain(int argc, _TCHAR* argv[])
{
CTestObj x;
std::wstring strval = (std::wstring) x;
return 0;
}
L'errore riscontrato è:
errore C2440: 'cast di tipo': non può convertire
'CTestObj'
-'std::wstring'
Nessun costruttore potrebbe prendere il tipo di sorgente, o la risoluzione di sovraccarico costruttore era ambigua
Mi sono già reso conto che commentare gli operatori di conversione risolve il problema di compilazione. Voglio solo capire:
- Quali 's sta succedendo sotto il cofano per causare questo
- Perché questo compila in VS2010 e non in VS2012? È a causa di una modifica del C++ 11?
Uh, molto probabilmente si tratta di un bug ... – ildjarn
Questo potrebbe essere il caso, ma la mia impressione è che è un cambiamento di rottura che io proprio non capisco. – jqcAngel
Avere l'operatore "LPCWSTR" è probabilmente una cattiva idea. Se hai una funzione 'CTestObj pippo()', allora l'operatore ammette automaticamente 'LPCWSTR x = pippo();', e ora hai un puntatore alla memoria liberata. – jamesdlin