Domanda
Questa è l'unica cosa che mi viene in mente. Il fatto è che senziente .
Ho uno struct come segue:
struct NumPair
{
wchar_t *pFirst, *pSecond;
int count;
con ctor, assegnamento per copia e costruzione
NumPair( wchar_t *pfirst, wchar_t *psecond, int count = 0)
NumPair( const NumPair& np )
NumPair& operator=( const NumPair& np )
Si tratta di un'estensione del mio ultimo problema in cui mi è stato chiesto di un modo per ordinare un elenco di personaggi puntatori con loro contenenti caratteri speciali (tedesco), come ü, ä, ö
.
La soluzione sembra essere utilizzando tipi di carattere di larghezza, ma il compilatore sta gettando oltre un centinaio di errori di conversione per qualche motivo.
ingresso Esempio:
// dict_ is a container of NumPairs.
dict_.push_back( NumPair ( "anfangen", "to begin, to start" ) );
Il compilatore si lamenta che non può convertire un const char *
ad un wchar_t
. Belle abbastanza, posso cambiare il push_back di dire
dict_.push_back( NumPair ( wchar_t("anfangen"), wchar_t("to begin, to start") ) );
Compiler errore:. Impossibile trovare un ctor NumPair, che accetta tutti gli argomenti
Cosa. Il. Inferno. Ho provato un completo ricostruzione, pensando il mio VSC ++ 10 è pasticciare in su. No, non indovinare.
Che cosa sto facendo di sbagliato?
codice
Il ctor, assegnazione e copiare la costruzione sono tutte le copie profonde dei puntatori wchar_t come qui di seguito.
wchar.h è incluso.
NumPair( wchar_t *pfirst, wchar_t *psecond, int count = 0)
: count(count)
{
size_t s1, s2;
s1 = wcslen(pfirst);
s2 = wcslen(psecond);
pFirst = new wchar_t[s1];
pSecond = new wchar_t[s2];
wcscpy(pFirst, pfirst);
wcscpy(pSecond, psecond);
}
Soluzione
Corde devono iniziare con una L essere stringhe di caratteri estesi, ad esempio L"abcdefghijk"
, che è di tipo const wchar_t*
. Senza la L è una stringa di caratteri stretta, di tipo const char*
, quindi l'errore è corretto; il tentativo di lanciare un const char*
per wchar_t*
non funziona, perché si sta solo cambiando il tipo di puntatore e di perdere il qualificatore const
(non fa nulla per la punta-dati). Inoltre, il secondo esempio è la creazione di oggetti wchar_t
da puntatori const char*
, che probabilmente non è ciò che si vuole o -. Che si desidera puntatori, non solo un singolo oggetto wchar_t
Non è senziente, sei solo non si cancella quello che stai facendo:)
Altri suggerimenti
Ci sono due questioni principali.
In primo luogo, un letterale stringa di wchar_t
è scritto come L"blah blah"
(notare che il L
).
In secondo luogo, la correttezza const
: dichiarare il vostro argomento formale come wchar_t const* pFirst
. Questo permette di utilizzare un letterale direttamente come parametro attuale. O qualsiasi stringa const
.
Saluti e hth.,
Prova
dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) );
La L denota è una stringa unicode (WCHAR).
Un "string in quotes"
è un array di char
s. Non è possibile convertire che per una serie di wchar_t
senza copiare. Ma con una L di fronte, un L"string in quotes"
è letterale che vi dà una serie di wchar_t
s invece. Si vuole che la L di fronte al vostro letterali:
NumPair( L"anfangen", L"to begin, to start" )
Per creare stringhe di caratteri wchar_t, utilizzare il prefisso L
sui letterali.
dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) );
P.S. Se non si crea le corde oggetto più grande della lunghezza della stringa per accogliere il terminatore di zero, sarete nei guai. Si potrebbe considerare l'utilizzo di std::wstring
.
Molto probabilmente, solo dimenticare farlo nel modo in cui sei con i puntatori e l'uso std :: wstring, il built-in class stringa che prende stringhe di caratteri di larghezza.
Se si sta andando sempre di utilizzare puntatori per letterali allora si dovrebbe usare const wchar_t * puntatori.
Si noti che il vostro struct sarà ancora assegnabili come i membri non sono puntatori costanti, sono i puntatori ai dati immutabili.