gpt4 book ai didi

c++ - 如何让这段涉及 unique_ptr 的代码进行编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:04 25 4
gpt4 key购买 nike

#include <vector>
#include <memory>

using namespace std;

class A {
public:
A(): i(new int) {}
A(A const& a) = delete;
A(A &&a): i(move(a.i)) {}

unique_ptr<int> i;
};

class AGroup {
public:
void AddA(A &&a) { a_.emplace_back(move(a)); }

vector<A> a_;
};

int main() {
AGroup ag;
ag.AddA(A());
return 0;
}

不编译...(说 unique_ptr 的复制构造函数被删除)

我尝试用 forward 替换 move。不确定我这样做是否正确,但它对我不起作用。


[~/nn/src] g++ a.cc -o a -std=c++0x
/opt/local/include/gcc44/c++/bits/unique_ptr.h: In member function 'A& A::operator=(const A&)':
a.cc:6: instantiated from 'void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]'
/opt/local/include/gcc44/c++/bits/vector.tcc:100: instantiated from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]'
a.cc:17: instantiated from here
/opt/local/include/gcc44/c++/bits/unique_ptr.h:219: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>& std::unique_ptr<_Tp, _Tp_Deleter>::operator=(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = std::default_delete<int>]'
a.cc:6: error: used here
In file included from /opt/local/include/gcc44/c++/vector:69,
from a.cc:1:
/opt/local/include/gcc44/c++/bits/vector.tcc: In member function 'void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]':
/opt/local/include/gcc44/c++/bits/vector.tcc:100: instantiated from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]'
a.cc:17: instantiated from here
/opt/local/include/gcc44/c++/bits/vector.tcc:314: note: synthesized method 'A& A::operator=(const A&)' first required here

最佳答案

可能您的标准库(还)没有定义 unique_ptr<T>::unique_ptr(unique_ptr &&) .我在 4.5 中检查了我的 header ,它就在那里,所以也许可以尝试升级。

当它找不到移动构造函数时,它会寻找复制构造函数并发现它被删除了。

不过,我在编译时遇到了其他错误。

编辑:开始工作了。我不明白你为什么要 move一个已经是右值引用的对象,但你这样做了。唯一的问题是缺少赋值运算符。

#include <vector>
#include <memory>

using namespace std;

class A {
public:
A(): i(new int) {}
A(A const& a) = delete;
A &operator=(A const &) = delete;
A(A &&a): i(move(a.i)) {}
A &operator=(A &&a ) { i = move(a.i); }

unique_ptr<int> i;
};

class AGroup {
public:
void AddA(A &&a) { a_.emplace_back(move(a)); }

vector<A> a_;
};

int main() {
AGroup ag;
ag.AddA(A());
return 0;
}

关于c++ - 如何让这段涉及 unique_ptr 的代码进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com