2009-06-16 122 views
4
_TCHAR* strGroupName = NULL; 
const _TCHAR* strTempName = NULL; 

//Assign some value to strTempName 

strGroupName = _tcschr(strTempName, 92) //C2440 

このコードをVS2008でコンパイルするとエラーが発生します。 VC6ではそれはうまくコンパイルされます。'const wchar_t *'から '_TCHAR *'に変換できません

エラーC2440: '=': '_TCHAR *' に '* constのwchar_t型' から変換することはできませんが

が問題であることを、私はそれをどのように修正すればよいそうですか?

答えて

5

strGroupName = (_TCHAR*)_tcschr(strTempName, 92); 

としてそれをキャストしてみキャストVS2008は、種類にもう少し厳密になったように思われ、自動的にいくつかのケースでそれらを行うことはありません。

+0

+1。これはコンパイルエラーを取り除いたものです。 – bobbyalex

+3

const_castを使用します。 – GManNickG

2

_tcschrは、constポインタを返しています。したがって、戻り値はconst _TCHAR* strGroupName = NULL;でなければなりません。strGroupNameをconstポインタに変更できない場合は、両方のポインタを非constポインタとして宣言してください。

+0

これは問題ありませんが、strGroupNameをconstに変更することはできません。const変数を必要としない残りのコードに影響するからです。たとえば、関数。 – bobbyalex

+1

次に、strTempNameとstrGroupNameを両方とも非constにします。 – Naveen

+0

+1両方が非constである可能性があるコメントを含む+1(おそらく答えに追加しますか?) –

4
strGroupName = const_cast<_TCHAR*>(_tcschr(strTempName, 92)); 

これは、使用する関数のバリアントにconst _TCHAR *があり、const _TCHAR *を返すためです。

strTempNameをconst _TCHAR *ではなく_TCHAR *として宣言することもできます。この場合、_TCHAR *パラメータを持ち、_TCHAR *値を返すバリアント関数が使用されます。

+0

ジャックの答えは良いですか?それはコンパイルエラーを取り除いたが、私は彼とあなたの違いを知りたい。 – bobbyalex

+0

このバージョンは優れています。これは、キャストが何であるかを具体的に示すことができます。つまり、関連しないタイプからキャストしていない、つまり単にconstを削除しているだけです。 –

+0

@Bobby const_cast操作を使用すると、簡単な検索を実行してコード内のconst型変換を簡単に見つけることができます。本当に必要な場合を除き、私はconstキャストを勧めるわけではありません。 2番目の選択肢(strTempNameを非constにする)は私の好みです。なぜなら、これ以上constを変更する必要がないからです。 Btw、strTempNameをconstとして宣言した理由は何ですか? –

1

strGroupNameconstへのポインタである必要があります。

const _TCHAR* strGroupName = _tcschr(strTempName, 92); 

これを初期化する呼び出しがあるまで宣言する必要はありません。

関連する問題