我想创建一个函数,一个auto_ptr
以Base
类,我想用一个称呼它auto_ptr
给Derived
类。但是我没有完成它。
我尝试使用它没有参考:
void function(std::auto_ptr<Base> ptr);
std::auto_ptr<Derived> derivedPtr( new ... )
function(derivedPtr); // error: #348: more than one user-defined conversion from
// "std::auto_ptr<Derived>" to "std::auto_ptr<Base>" applies
并带有参考:
void function(std::auto_ptr<Base>& ptr);
std::auto_ptr<Derived> derivedPtr( new ... )
function(derivedPtr); //error: #304: no instance of overloaded function "function"
// matches the argument list
编辑:我知道auto_ptr已过时,但我只能访问C++03
并且不能访问boost
。因此,如果答案将集中在问题本身上,我将不胜感激:)我也理解按值引用函数和auto_ptr的区别。在我的实际代码中,该函数拥有的所有权,auto_ptr
因此,如果我可以将转换从转换Derived
为Base
正常工作,那么两者都很好。
您可以毫不含糊地进行投放:
function(static_cast<std::auto_ptr<Base> >(derivedPtr));
请注意,要使其正常工作,Base
必须具有虚拟析构函数。否则,代码将具有未定义的行为。
产生歧义的原因就像Arne在他的回答中所说-对于调用者来说,是不function
带值还是引用是不明显的,因此对于调用者而言,通过调用是否auto_ptr
将释放它们,以及是否将其释放,也并不明显。释放是否将其转换为可以正确delete
指针的类型。模棱两可的转换AFAIK可以阻止您编写如此困难的代码。通过强制转换,您可以在derivedPtr
发布的调用代码中将其明确显示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句