1

それが私が考えることができる唯一のことです。物事は感性です。

私は次のような構造体を持っています:

struct NumPair
{
    wchar_t *pFirst, *pSecond;
    int count;

ctorを使用して、コピーの割り当てとコンストラクターを

NumPair( wchar_t *pfirst, wchar_t *psecond, int count = 0)
NumPair( const NumPair& np )
NumPair& operator=( const NumPair& np )

これは私の最後の問題の拡張であり、文字ポインタのリストを、などの特殊な(ドイツ語の)文字を含むものでソートする方法を求めていましたü, ä, ö

解決策はワイド文字タイプを使用しているようですが、コンパイラーは何らかの理由で100を超える変換エラーをスローしています。

サンプル入力:

// dict_ is a container of NumPairs.
dict_.push_back( NumPair ( "anfangen", "to begin, to start" ) );

const char *コンパイラは、をに変換できないと文句を言っていますwchar_t。結構です、push_backを次のように変更します

dict_.push_back( NumPair ( wchar_t("anfangen"), wchar_t("to begin, to start") ) );

コンパイラエラー:すべての引数を受け入れるNumPairコンストラクタが見つかりません。

何。。地獄。VSC ++ 10がおかしくなっていると思って、完全な再構築を試みました。いいえ、違います。

私は何が間違っているのですか?

コード

ctor、assignment、およびcopy構文はすべて、以下のようなwchar_tポインターのディープコピーです。

wchar.hが含まれています。

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);
}
4

6 に答える 6

5

2つの主要な問題があります。

まず、の文字列リテラルは次のwchar_tように記述されますL"blah blah"(に注意してくださいL)。

第二に、const正しさ:のような正式な引数を宣言しますwchar_t const* pFirst。これにより、リテラルを実際の引数として直接使用できます。または任意のconst文字列。

乾杯&hth。、

于 2010-11-01T17:45:29.033 に答える
4

文字列は、Lで始まる必要があり、ワイド文字の文字列リテラルになります。たとえばL"abcdefghijk"、タイプはconst wchar_t*です。Lがない場合は、タイプが狭い文字列であるconst char*ため、エラーは正しいです。ポインタのタイプを変更して修飾子を失っただけなので、にキャストしようとしても機能const char*しません(ポイントされたデータには何もしません)。また、2番目の例は、ポインターからオブジェクトを作成することです。これは、おそらく必要なものではありません。単一のオブジェクトだけでなく、ポインターも必要です。wchar_t*constwchar_tconst char*wchar_t

それは感性ではありません、あなたはあなたが何をしているのかはっきりしていないだけです:)

于 2010-11-01T17:45:35.730 に答える
3

試す

dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) ); 

Lは、Unicode(wchar)文字列であることを示します。

于 2010-11-01T17:44:16.037 に答える
3

A"string in quotes"charsの配列です。wchar_tコピーせずにそれをの配列に変換することはできません。ただし、前にLがある場合、aL"string in quotes"はリテラルであり、wchar_t代わりにsの配列を提供します。リテラルの前にそのLが必要です。

NumPair( L"anfangen", L"to begin, to start" )
于 2010-11-01T17:46:20.170 に答える
2

wchar_t文字の文字列を作成するLには、リテラルのプレフィックスを使用します。

dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) ); 

PSゼロターミネータに対応するために文字列の長さより1つ大きいオブジェクト文字列を作成しないと、問題が発生します。の使用を検討してstd::wstringください。

于 2010-11-01T17:45:10.490 に答える
2

ほとんどの場合、ポインタを使用する場合と同じようにすることを忘れて、ワイド文字列を受け取る組み込みの文字列クラスであるstd::wstringを使用してください。

リテラルへのポインタを常に使用する場合は、constwchar_t*ポインタを使用する必要があります。

メンバーは定数ポインターではなく、不変データへのポインターであるため、構造体は引き続き割り当て可能であることに注意してください。

于 2010-11-01T18:12:26.080 に答える