更新:回避策にAutoAを使用するようにコード例を編集しました(これは当初の意図でした)。rlbondの答えを見てこれを実現しました。
auto_ptr
このスレッドからの推奨事項に基づいて、コードにの使用法を取り入れようとしています。
メソッドインターフェイスを介してC++引数の使用法を表現する
ただし、Visual Studio 6.0でコンパイルすると、予期しないコンパイルエラーが発生します。std::auto_ptr
派生型のaからstd::auto_ptr
基本型のへの割り当て/コピーを処理するときに問題があります。これは私のコンパイラに固有の問題ですか?
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)