没有可用的复制构造函数或复制构造函数被声明为“显式”

时间:2010-08-06 00:04:40

标签: c++ compiler-errors cautoptr

有人可以解释为什么我在这里收到编译错误 - 错误C2558:类'std :: auto_ptr< _Ty>' :没有可用的复制构造函数或复制构造函数被声明为'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 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

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

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

要求存在const&的复制构造函数,并且std::auto_ptr不存在此类构造函数。这被广泛视为好东西,因为你永远不应该在容器中使用std::auto_ptr如果你不明白为什么会这样,那么{{3} },特别是标题为“不做的事情,为什么不做他们”的部分约3/4。

答案 2 :(得分:4)

您无法在此处创建auto_ptr的标准库容器:

std::vector< testptr > others_;

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

答案 3 :(得分: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