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);
}
È stato utile?

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 chars. 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_ts 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top