use of deleted function
code:cpp
class Recording
{
public:
k4a::playback playback;
Recording(string filename) {
playback = k4a::playback::open(filename.c_str());
}
};
int
main (int argc, char** argv)
{
ros::init (argc, argv, "my_pcl_tutorial");
ros::NodeHandle nh("~");
vector<Recording> recordings;
XmlRpc::XmlRpcValue parameters;
nh.getParam(ros::this_node::getName(), parameters);
for (int i = 0; i < 3; i++)
{
string filename;
Recording recording(filename);
recordings.push_back(recording);
}
}
code:Error
/home/xxx/kinect_ws/src/pcl/src/concat.cpp:61:38: required from here
/usr/include/c++/7/ext/new_allocator.h:136:4: error: use of deleted function ‘Recording::Recording(const Recording&)’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/xxx/kinect_ws/src/pcl/src/concat.cpp:35:7: note: ‘Recording::Recording(const Recording&)’ is implicitly deleted because the default definition would be ill-formed:
class Recording
^~~~~~~~~
/home/xxx/kinect_ws/src/pcl/src/concat.cpp:35:7: error: use of deleted function ‘k4a::playback::playback(const k4a::playback&)’
In file included from /home/xxx/kinect_ws/src/pcl/src/concat.cpp:15:0:
/usr/include/k4arecord/playback.hpp:145:5: note: declared here
playback(const playback &) = delete;
解決策1: push_backに渡すときに初期化する
code:cpp
recordings.push_back(filename);
解決策2: reserveする
解説
playback (const playback &)=delete
となっており、オブジェクトが消される仕様になっていることが分かる。
一方、ムーブコンストラクタは定義されているため、コピーコンストラクタを呼ばないでムーブコンストラクタを呼ぶとよい。
自作クラスにムーブコンストラクタが無くても、多くの場合デフォルトムーブコンストラクタがimplicitに定義される。このムーブコンストラクタは、メンバのオブジェクトのムーブコンストラクタを呼んでくれる。 reserveしたあとpush_backすると、ムーブコンストラクタが呼ばれる。
emplace_backにして解決する問題ではないようだがよくわからん。