2

このようなことをしようとすると、このエラーが頻繁に発生します

CString filePath = theApp->GetSystemPath() + "test.bmp";

コンパイラが教えてくれる

error C2110: '+' : cannot add two pointers

しかし、これを以下に変更すると、正常に動作しますか?

CString filePath = theApp->GetSystemPath();
filePath += "test.bmp";

GetSystemPathそれが何か関係がある場合、関数はLPCTSTRを返します

4

4 に答える 4

5

これは、扱っているオブジェクトの種類に関係しています。

CString filePath = theApp->GetSystemPath() + "test.bmp";

上記の行は、「test.bmp」または LPCTSTR + char[]; を使用して GetSystemPath() のタイプを追加しようとしています。これら 2 つの型には + 演算子がないため、コンパイラはこれを行う方法を知りません。

これが機能する理由:

filePath += "test.bmp";

CString + char[] (char*); を実行しているためです。CString クラスには、CString + char* の追加をサポートするためにオーバーロードされた + 演算子があります。または、2 つの CString オブジェクトに加算演算子を適用する前に、char* から CString を構築します。LPCTSTR には、この演算子がオーバーロードされていないか、適切なコンストラクターが定義されていません。

于 2013-05-01T19:07:45.157 に答える
4

2 つのポインターを追加することはできません。機能する理由filePath += "test.bmp";は、左側がポインターではなく CString であるためです。これも機能します

CString(theApp->GetSystemPath()) + "test.bmp";

これもそうでしょう

theApp->GetSystemPath() + CString("test.bmp");

C++ の規則では、引数の少なくとも 1 つがクラス型でない限り、演算子をオーバーロードできません。したがって、ポインターのみの operator+ をオーバーロードすることは誰にもできません。

于 2013-05-01T19:08:22.927 に答える
2

これを行うとき:

CString filePath = theApp->GetSystemPath() + "test.bmp";

タイプ の2 つのポインターを合計しようとしていconst char*ます。コンパイラがあなたに言っているように、operator +タイプ s の 2 つのポインターをconst char*入力として受け入れる のオーバーロードはありません (結局のところ、ポインターを合計するのではなく、それらのポインターが指すゼロで終わる文字列を連結する必要があります)。 .

一方、 aと aを取るof operator +=(および of ) のオーバーロードがあり、これが 2 番目の例がコンパイルされる理由です。同じ理由で、これも機能します。operator +CStringconst char*

CString filePath = theApp->GetSystemPath() + CString("test.bmp");

これと同様に:

CString filePath = CString(theApp->GetSystemPath()) + "test.bmp";
于 2013-05-01T19:08:00.920 に答える
0

コンパイラは、プログラマが 2 つの文字列を連結しようとしていることを認識していない場合があります。演算子char const *を使用して a が別のものに追加されていることを確認するだけです。+

私はこのようなことを試してみます:

CString filePath = CString( theApp->GetSystemPath() ) + CString( "test.bmp" );
于 2013-05-01T19:07:44.820 に答える