8

ここでコンパイルエラーが発生する理由を誰かが説明してください-エラーC2558:クラス 'std::auto_ptr<_Ty>':コピーコンストラクターが使用できないか、コピーコンストラクターが「明示的」と宣言されています

#include <memory>
#include <vector>
#include <string>
template<typename T>
struct test
{
    typedef std::auto_ptr<T> dataptr;
    typedef std::auto_ptr< test<T> > testptr;
    test( const T& data ):
    data_( new T(data) )
    {
    };
    void add_other( const T& other )
    {
        others_.push_back( testptr( new test(other) ) );
    }
private:
    dataptr data_;
    std::vector< testptr > others_;
};

int main(int argc, char* argv[])
{
    test<std::string> g("d");

    //this is the line that causes the error.
    g.add_other("d");

    return 0;
}
4

4 に答える 4

7

基本的に、std::auto_ptrこのように使用することはできません。

others_.push_back( testptr( new test(other) ) );

を受け取るコピー コンストラクターがconst&存在し、そのようなコンストラクターが に対して存在しないことが必要ですstd::auto_ptrコンテナ内で使用してはならないため、これは広く良いことだと考えられています。 これがなぜなのか理解できない場合は、Herb Sutter によるこの記事、特に「すべきでないこととすべきでない理由」というタイトルのセクションの 3/4 を読んでください。std::auto_ptr

于 2010-08-06T00:15:57.923 に答える
6
    others_.push_back( testptr( new test(other) ) );

を に押し込もうとしてauto_ptrいますstd::vector

auto_ptr 暗黙のコピー コンストラクターを定義せず、stl コンテナー クラスの値として互換性がありません。

詳細については、この質問を参照してください: StackOverflow:Why is it wrong to use stdauto ptr with stl containers

于 2010-08-06T00:08:12.510 に答える
4

ここでやろうとしているように、auto_ptr の標準ライブラリ コンテナーを作成することはできません。

std::vector< testptr > others_;

正しいセマンティクスを持っていないためです。通常のポインターを使用するか、 などの別の種類のスマート ポインターを使用する必要がありますshared_ptr

于 2010-08-06T00:08:49.733 に答える
2

std::unique_ptr または std::shared_ptr が実装されているコンパイラ (gcc 4.5+) にアクセスできる場合、auto_ptr を置き換える今後の C++0x 標準からおそらく必要です。

http://www2.research.att.com/~bs/C++0xFAQ.html#std-unique_ptr http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr

于 2010-08-06T00:17:04.850 に答える