0

私はこれを行う関数を持っています:

static MyClass* MyFunction(myparams)
{
    return new MyClass(myparams)
}

そして、次のシグネチャを持つ別の関数内でこの関数を呼び出すことができます。

void MyFunction2(std::auto_ptr<MyClass> myparam)

しかし、それを実行しようとすると、コンパイラエラーが発生します。

最初のパラメータをMyClass*からstd::auto_ptr<_Ty>に変換できません

なぜ?助けてくれてありがとう

編集1 尋ねられたように、myparamsタイプは正常ですが、関数がテンプレートクラス内にあるため、Tパラメータもあります

4

3 に答える 3

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));
}
于 2011-02-10T18:18:55.297 に答える
0

生のポインタから。への暗黙の変換はありませんauto_ptr。明示的にそれを呼び出します:

MyFunction2(std::auto_ptr(MyFunction(params)));

MyFunction2割り当てられたメモは、一時的なauto_ptrものがなくなり、割り当てが解除されるため、への呼び出し後に破棄されることに注意してください。

于 2011-02-10T18:18:29.060 に答える
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、削除されたオブジェクトを指します。

于 2011-02-10T18:21:12.647 に答える