質問
それが私が考えることができる唯一のことです。事は 感覚的.
次のような構造体があります:
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" ) );
コンパイラは、aを変換できないと不平を言っています const char *
に wchar_t
. 。十分に細かく、私はプッシュ_backを変更して言います
dict_.push_back( NumPair ( wchar_t("anfangen"), wchar_t("to begin, to start") ) );
コンパイラエラー:すべての引数を受け入れるNumpair CTORを見つけることができません。
何。 。地獄。 VSC ++ 10がマッキングアップしていると考えて、完全な再構築を試みました。いいえ、そうではないと思います。
私は何が間違っているのですか?
コード
CTOR、割り当て、コピー構造はすべて、以下のような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);
}
解決
文字列は、Lから始めなければなりません。 L"abcdefghijk"
, 、タイプのものです const wchar_t*
. 。 lがなければ、それは狭い文字列です、タイプの const char*
, 、したがって、エラーは正しいです。キャストしようとしています const char*
に wchar_t*
ポインターのタイプを変更して失うだけなので、動作しません。 const
修飾子(先の尖ったデータに対して何もしません)。また、2番目の例は作成です wchar_t
からのオブジェクト const char*
ポインター、おそらくあなたも望むものでもない - あなたは単なるシングルではなく、ポインターが欲しい wchar_t
物体。
それは感覚的ではありません、あなたはあなたが何をしているのかを明らかにしていません:)
他のヒント
主に2つの問題があります。
まず、文字通りの文字列 wchar_t
のように書かれています L"blah blah"
(注意してください L
).
2番、 const
正しさ:あなたの正式な議論を次のように宣言します wchar_t const* pFirst
. 。これにより、リテラルを実際の引数として直接使用できます。または何か const
ストリング。
乾杯&hth。、
試す
dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) );
Lは、それがユニコード(WCHAR)文字列であることを示します。
a "string in quotes"
の配列です char
s。それを配列に変換することはできません wchar_t
コピーせずに。しかし、Lが前にある場合、a L"string in quotes"
の配列を提供する文字通りです wchar_t
代わりにs。あなたはあなたのリテラルの前にそのlを望んでいます:
NumPair( L"anfangen", L"to begin, to start" )
wchar_t文字の文字列を作成するには、を使用します L
リテラルのプレフィックス。
dict_.push_back( NumPair ( L"anfangen", L"to begin, to start" ) );
PSゼロターミネーターを伴うために文字列の長さより1つ大きいオブジェクト文字列を作成しないと、問題が発生します。使用を検討する場合があります std::wstring
.
ほとんどの場合、ポインターのようにそれを行うことを忘れて、STD :: WSTRINGを使用してください。
常にリテラルにポインターを使用する場合は、const wchar_t *ポインターを使用する必要があります。
メンバーは一定のポインターではなく、不変のデータへのポインターであるため、構造体は引き続き割り当てられることに注意してください。