我有一个简单的类结构建模离散模拟,其中包含一个状态矢量,每个状态矢量都包含多个Transitions,并保存为智能指针的矢量。我使用智能指针来保存转换,因为在我的完整应用程序中我需要多态。将unique_ptr对象推入C++的向量中
#include <vector>
#include <memory>
class Transition {
public:
Transition() {}
};
class State {
public:
State(int num) : num(num), transitions() {}
void add_transition(std::unique_ptr<Transition> trans) {
transitions.push_back(std::move(trans));
}
private:
int num;
std::vector<std::unique_ptr<Transition>> transitions;
};
int main() {
std::vector<State> states;
for (int i = 0; i < 10; i++) {
State nstate = State(i);
for (int j = 0; j < 2; j++) {
nstate.add_transition(std::move(std::unique_ptr<Transition>(new Transition())));
}
// This line causes compiler errors
states.push_back(nstate);
}
}
我添加新的状态对象为载体时得到编译器错误:
Error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Transition; _Dp = std::default_delete<Transition>]’
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
我想这是由于矢量使国家物体也试图使一个副本的副本unique_ptrs
这是不允许的矢量的。我已经看到emplace_back
不会像push_back
那样制作副本,但我仍然得到相同的错误。
将状态对象直接添加到矢量工程中,但我更愿意避免这种解决方法,因为在我的实际代码中,我使用State对象做了更多的工作,而不是仅仅添加转换并且不想继续访问向量。
int main() {
std::vector<State> states;
for (int i = 0; i < 10; i++) {
states.push_back(State(i));
for (int j = 0; j < 2; j++) {
states[i].add_transition(std::move(std::unique_ptr<Transition>(new Transition())));
}
}
}
添加一个移动构造函数,你可以默认它。 – Nim