Errore della conversione di tipi in C ++
-
26-09-2019 - |
Domanda
Ho un programma in cui ho bisogno di utilizzare il formato (); funzione per unire un letterale stringa e un int in una variabile CString. Ho provato diversi modi di fare questo, il codice per loro è qui:
// declare variables used
CString _CString;
int _int;
// try to use format function with string literal
_CString.Format("text",_int);
// try to use format function with C-Style cast
_CString.Format((wchar_t)"text",_int);
// try to use format function with static_cast
_CString.Format(static_cast<wchar_t>("text"),_int);
Il primo restituisce uno errore C2664: 'ATL vuoto :: CStringT :: Format (const wchar_t *, ...)': non può convertire il parametro 1 da 'const char [33]' a 'const wchar_t *'
Per il secondo, non v'è alcun errore, ma il testo viene visualizzato in caratteri cinesi.
La terza restituisce uno errore C2440: 'static_cast': non può convertire da 'const char [33]' a 'wchar_t'
Tutte le idee per la conversione CStrings a wchar_t * s?
Grazie
Soluzione
Il problema è che si sta eseguendo una build Unicode (che va bene), in modo che il
_CString.Format();
funzione i aspettandosi il primo parametro da una stringa di caratteri di larghezza. È necessario utilizzare la sintassi L""
per formare un ampio caratteri stringa letterale:
_CString.Format(L"text",_int);
Naturalmente, avrete bisogno di un identificatore per effettivamente ottenere la variabile int
formattato nel CString:
_CString.Format(L"text: %d",_int);
Se si include l'intestazione tchar.h
, è possibile utilizzare le macro di Microsoft per rendere la stringa letterale di caratteri estesi o regular-vecchio caratteri (altrimenti noto come ANSI) a seconda se si sta costruendo UNICODE o no:
_CString.Format(_T("text: %d)",_int);
, ma direi che se non hai intenzione di roba eredità supporto che ti richiedono il supporto ANSI, probabilmente non perdere tempo con la roba tchar.h
.
Altri suggerimenti
Beh, non è del tutto chiaro che tipo stringa che come target, ma ecco quello che avrei fatto:
_CString.Format(_T("%d"), _int);
Il tentativo di cast di tipo una stringa multi-byte in una stringa Unicode può compilare, ma è in cerca di guai, perché è ancora una stringa multi-byte. Avrai bisogno di convertire l'intera stringa e non solo typecast, se questo è ciò che si desidera.
Prova la funzione mbstowcs. http://msdn.microsoft.com/en- us / library / ms235631 (v = vs.80) aspx