3

auto_ptr を NULL に初期化し、ゲームの後半でそれが NULL であるかどうか、またはそれまたは新しいコピーを返さないかどうかを知る必要があります。

私はこれを試しました

auto_ptr<RequestContext> ret = (mReqContext.get() != 0) ? mReqContext : new RequestContext();

そして、他のいくつかの同様のキャストなどがありますが、g ++はauto_ptrsの存在しない演算子を呼び出そうとしますか? 三項比較に RequestContext* を使用する代わりに (三項演算子)。

キャストしてもうまくいきません。

ヒントはありますか?

等しいものを等しくないものに編集

4

6 に答える 6

20

状況は次のようなものだと思います。

#include <iostream>
#include <memory>

int main()
{
    std::auto_ptr<int> a(new int(10));
    std::auto_ptr<int> b = a.get() ? a : new int(10);
}

そして、コモーの非常に啓発的なエラーメッセージは次のとおりです。

"ComeauTest.c", line 7: error: operand types are incompatible ("std::auto_ptr<int>"
          and "int *")
      std::auto_ptr<int> b = a.get() ? a : new int(10);
                                         ^

三項演算子では、両方の結果に互換性のある型が必要です。一方のケースではユーザー定義オブジェクトを返し、もう一方のケースではネイキッド ポインターを返すことはできません。注意!明示的なstd::auto_ptrコンストラクターでポインターを受け取ります。つまり、三項演算子は 2 番目の引数を暗黙的に変換できません。std::auto_ptr

そして可能な解決策:

std::auto_ptr<int> b = a.get() ? a : std::auto_ptr<int>(new int(10));
于 2009-10-07T13:57:57.793 に答える
2

mReqContextタイプauto_ptr<RequestContext>ですよね?次に、問題は の両側で互換性のない型である可能性があり:ます。new RequestContext()RequestContext *

考えられる解決策: どちらかを使用

auto_ptr<RequestContext>(new RequestContext)

:orの右側で

mReqContext.get()

の左側にあり:ます。

auto_ptrどちらの場合も: !でのポインターの所有権の問題に注意してください。の(生の)ポインタはauto_ptr単一のオブジェクトのみが所有できるauto_ptrため、私の「単純な」ソリューションはどちらもあなたが望むものではないかもしれません(最初のものmReqContextはゼロ以外のときにクリアされ、2番目のものはそうではありませんの重複削除につながる可能性がありますmReqContext)。

于 2009-10-07T13:57:41.493 に答える
1

試す

auto_ptr<RequestContext> ret;
ret.reset(new stuff here);
于 2009-10-07T13:41:55.817 に答える
0

すべてを中括弧に入れてみましたか?

auto_ptr<RequestContext> ret =
    (mReqContext.get() == 0) ? (mReqContext) : (new RequestContext());
于 2009-10-07T13:45:14.437 に答える
0

auto_ptr にポインターを割り当てていないことを確認してください。これは機能しません。ただし、これらすべてのフラグメントは問題なくコンパイルされます。

#include <memory>
#include <string>

using namespace std;
int main(int argc, char * argv[] )
{
    auto_ptr<int> pX;
    pX.reset(pX.get() ? new int(1) : new int(2));
    pX = auto_ptr<int>(pX.get() ? new int(1) : new int(2));
    pX = auto_ptr<int>((pX.get()==NULL) ? new int(1) : new int(2));

    return 0;
}
于 2009-10-07T13:47:01.157 に答える
0

それを2行に分けてみましたか?

RequestContext *p = (mReqContext.get() == 0) ? mReqContext : new RequestContext();
auto_ptr<RequestContext> ret = p;
于 2009-10-07T13:43:55.230 に答える