更新:编辑代码示例以使用 AutoA 作为解决方法(这是最初的意图)。看到 rlbond 的答案后意识到这一点。
我正在尝试auto_ptr
根据此线程的建议在我的代码中使用 :
但是,在使用 Visual Studio 6.0 进行编译时,我收到了一些意外的编译错误。std::auto_ptr
在处理派生类型的 astd::auto_ptr
到基类型的 a 的分配/副本时,它会出现问题。这是我的编译器特有的问题吗?
我知道强烈建议使用 Boost,但在我的项目中它不是一个选项。如果我仍然想使用auto_ptr
,我是否被迫使用调用的解决方法std::auto_ptr::release()
?从我目前遇到的情况来看,这个问题会导致编译器错误,所以很容易捕捉到。但是,采用调用 release 的约定来分配给基本类型的“auto_ptr”是否会让我面临任何维护问题?特别是如果使用不同的编译器构建(假设其他编译器没有这个问题)。
如果release()
由于我的情况,解决方法不好,我是否应该使用不同的约定来描述所有权转移?
以下是说明问题的示例。
#include "stdafx.h"
#include <memory>
struct A
{
int x;
};
struct B : public A
{
int y;
};
typedef std::auto_ptr<A> AutoA;
typedef std::auto_ptr<B> AutoB;
void sink(AutoA a)
{
//Some Code....
}
int main(int argc, char* argv[])
{
//Raws to auto ptr
AutoA a_raw_to_a_auto(new A());
AutoB b_raw_to_b_auto(new B());
AutoA b_raw_to_a_auto(new B());
//autos to same type autos
AutoA a_auto_to_a_auto(a_raw_to_a_auto);
AutoB b_auto_to_b_auto(b_raw_to_b_auto);
//raw derive to auto base
AutoB b_auto(new B());
//auto derive to auto base
AutoA b_auto_to_a_auto(b_auto); //fails to compile
//workaround to avoid compile error.
AutoB b_workaround(new B());
AutoA b_auto_to_a_auto_workaround(b_workaround.release());
sink(a_raw_to_a_auto);
sink(b_raw_to_b_auto); //fails to compile
return 0;
}
编译错误:
Compiling...
Sandbox.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\Sandbox\Sandbox.cpp(40) : error C2664: '__thiscall std::auto_ptr<struct A>::std::auto_ptr<struct A>(struct A *)' : cannot convert parameter 1 from 'class std::auto_ptr<struct B>' to 'struct A *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
C:\Program Files\Microsoft Visual Studio\MyProjects\Sandbox\Sandbox.cpp(47) : error C2664: 'sink' : cannot convert parameter 1 from 'class std::auto_ptr<struct B>' to 'class std::auto_ptr<struct A>'
No constructor could take the source type, or constructor overload resolution was ambiguous
Error executing cl.exe.
Sandbox.exe - 2 error(s), 0 warning(s)