8

有人可以解释为什么我在这里遇到编译错误 - 错误 C2558: class 'std::auto_ptr<_Ty>' : no copy constructor available or copy constructor is declared 'explicit'

#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

基本上 astd::auto_ptr不能以这种方式使用。

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

需要一个接受 a 的复制构造函数,const&并且不存在这样的构造函数std::auto_ptr。这被广泛认为是一件好事,因为您永远不应该std::auto_ptr在容器中使用! 如果您不明白为什么会这样,请阅读 Herb Sutter 的这篇文章,尤其是大约 3/4 的标题为“不该做的事情,以及为什么不做”的部分。

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

你正试图将一个推auto_ptr入一个std::vector

auto_ptr 未定义隐式复制构造函数,并且作为 stl 容器类中的值不兼容。

有关更多信息,请参阅此问题:StackOverflow:为什么将 stdauto ptr 与 stl 容器一起使用是错误的

于 2010-08-06T00:08:12.510 回答
4

您无法创建 auto_ptr 的标准库容器,就像您在这里尝试做的那样:

std::vector< testptr > others_;

因为它们没有正确的语义。您将不得不使用普通指针或不同风格的智能指针,例如shared_ptr.

于 2010-08-06T00:08:49.733 回答
2

您可能需要即将推出的 C++0x 标准中的 std::unique_ptr 或 std::shared_ptr ,如果您可以访问已实现这些功能的编译器(gcc 4.5+),它将替换 auto_ptr

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 回答