有人可以解释为什么我在这里收到编译错误 - 错误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;
}
答案 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_ptrhttp://www2.research.att.com/~bs/C++0xFAQ.html#std-unique_ptr http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr