我有一个执行此操作的功能:
static MyClass* MyFunction(myparams)
{
return new MyClass(myparams)
}
我可以在具有以下签名的另一个中调用此函数:
void MyFunction2(std::auto_ptr<MyClass> myparam)
但是当我尝试这样做时,我遇到了编译错误:
无法转换第一个参数 从MyClass *到std :: auto_ptr&lt; _Ty&gt;
为什么呢?感谢您的帮助
编辑1 正如所问,myparams类型是正常的,但也有一个T param,因为该函数在模板类中
答案 0 :(得分:9)
std::auto_ptr<>
有一个显式的构造函数,就像任何其他智能指针一样。这意味着没有从T*
到std::auto_ptr<T>
的隐式转换,以防止意外删除对象。因此,您需要明确地将原始指针转换为std::auto_ptr<>
:
MyFunction2(std::auto_ptr<MyClass>(MyFunction()));
使工厂函数返回智能指针而不是原始指针也是一个好主意,它使读者清楚地知道对象的所有权正在传递给调用者:
static std::auto_ptr<MyClass> MyFunction(myparams)
{
return std::auto_ptr<MyClass>(new MyClass(myparams));
}
答案 1 :(得分:0)
没有从原始指针到auto_ptr
的隐式转换。只是明确地说出来:
MyFunction2(std::auto_ptr(MyFunction(params)));
请注意,在调用MyFunction2
后,分配的memoty将被销毁,因为临时auto_ptr
将会消失,并将其解除分配。
答案 2 :(得分:0)
您可能想要像这样调用MyFunction2函数......
void f() {
MyClass* directptr = MyFunction(myparams);
std::auto_ptr<MyClass> p(directptr);
MyFunction2(p);
cout << p.get() << endl; // Prints NULL!
}
但是,当MyFunction2
结束时,MyClass
实例将被删除,并且在退回时p
将为NULL,directptr
将指向已删除的对象。