auto_ptr内容上的三元运算符无法正常工作

时间:2009-10-07 13:40:48

标签: c++ stl auto-ptr

我将auto_ptr初始化为NULL,稍后在游戏中我需要知道它是否为NULL以返回它或新副本。

我试过这个

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

和其他几个类似的东西一样,但是g ++试图调用auto_ptrs不存在的运算符? (三元运算符)而不是使用RequestContext *进行三元比较。

即使我施展它也不起作用。

任何提示?

编辑等于非等值

6 个答案:

答案 0 :(得分: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);
}

这是Comeau非常有启发性的错误信息:

"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);
                                         ^

三元运算符需要两种结果的兼容类型,你不能让它在一种情况下返回用户定义的对象而在另一种情况下返回裸指针。 NB! std::auto_ptr显式构造函数中使用指针,这意味着三元运算符无法将第二个参数隐式转换为std::auto_ptr

可能的解决方案:

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

答案 1 :(得分:2)

mReqContext的类型为auto_ptr<RequestContext>,对吗?然后问题可能是:两侧的不兼容类型,因为new RequestContext()产生RequestContext *,但两者必须具有三元运算符可用的公共类型。

可能的解决方案:使用

auto_ptr<RequestContext>(new RequestContext)

位于:的右侧或使用

mReqContext.get()

位于:的左侧。

在这两种情况下:注意auto_ptr的指针所有权问题! auto_ptr中的(原始)指针只能由一个auto_ptr对象拥有,因此我的两个“简单”解决方案可能都不是您想要的(第一个解决方案清除{{1}当它不为零时,第二个不会,但可能导致重复删除mReqContext)。

答案 2 :(得分:1)

auto_ptr<RequestContext> ret;
ret.reset(new stuff here);

答案 3 :(得分:0)

你试过,把它分成两行吗?

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

答案 4 :(得分:0)

您是否尝试过将其全部放入括号中?

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

答案 5 :(得分: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;
}