use of deleted function
#C++
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;
filename = string(parameters"filename" + to_string(i + 1));
Recording recording(filename);
recordings.push_back(recording);
}
}
code:Error
/usr/include/c++/7/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) with _Up = Recording; _Args = {const Recording&}; _Tp = Recording’:
/usr/include/c++/7/bits/alloc_traits.h:475:4: required from ‘static void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) with _Up = Recording; _Args = {const Recording&}; _Tp = Recording; std::allocator_traits<std::allocator<_CharT> >::allocator_type = std::allocator<Recording>’
/usr/include/c++/7/bits/stl_vector.h:943:30: required from ‘void std::vector<_Tp, _Alloc>::push_back(const value_type&) with _Tp = Recording; _Alloc = std::allocator<Recording>; std::vector<_Tp, _Alloc>::value_type = Recording’
/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のコピーコンストラクタが呼ばれている。playbackのコピーコンストラクタはReferenceを見ると、
playback (const playback &)=delete
となっており、オブジェクトが消される仕様になっていることが分かる。
一方、ムーブコンストラクタは定義されているため、コピーコンストラクタを呼ばないでムーブコンストラクタを呼ぶとよい。
自作クラスにムーブコンストラクタが無くても、多くの場合デフォルトムーブコンストラクタがimplicitに定義される。このムーブコンストラクタは、メンバのオブジェクトのムーブコンストラクタを呼んでくれる。
reserveしたあとpush_backすると、ムーブコンストラクタが呼ばれる。
emplace_backにして解決する問題ではないようだがよくわからん。