std :: vector :: push_back: un objeto que no se puede copiar genera un error de compilación
Recibo errores de compilación eng++ (GCC) 4.7.2
pero no enMSVC-2012
cuando intentostd::vector::push_back
un objeto no copiable (constructor de copia privada) pero movible. Para mí, mi ejemplo es idéntico a muchos otros ejemplos en SO y en otros lugares. El mensaje de error hace que parezca un problema porque la estructura no es "constructible directamente". No sé lo que esto significa, por lo que estoy totalmente inseguro de por qué un objeto debe ser "constructible directo" para ser rechazado.
#include <vector>
#include <memory>
struct MyStruct
{
MyStruct(std::unique_ptr<int> p);
MyStruct(MyStruct&& other);
MyStruct& operator=(MyStruct&& other);
std::unique_ptr<int> mP;
private:
// Non-copyable
MyStruct(const MyStruct&);
MyStruct& operator=(const MyStruct& other);
};
int main()
{
MyStruct s(std::unique_ptr<int>(new int(5)));
std::vector<MyStruct> v;
auto other = std::move(s); // Test it is moveable
v.push_back(std::move(other)); // Fails to compile
return 0;
}
Da errores
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/type_traits: In instantiation of ‘struct std::__is_direct_constructible_impl<MyStruct, const MyStruct&>’:
... snip ...
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/stl_vector.h:900:9: required from ‘void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = MyStruct; _Alloc = std::allocator<MyStruct>; std::vector<_Tp, _Alloc>::value_type = MyStruct]’
main.cpp:27:33: required from here
main.cpp:16:5: error: ‘MyStruct::MyStruct(const MyStruct&)’ is private
Solución simple a partir de varias respuestas:
UtilizarMyStruct(const MyStruct&) = delete;
en lugar deprivate ctor
cortarHeredarboost::noncopyable
(u otra clase con ctor privado)