如何用 std:unique_ptr 擦除包含结构的向量?
How to erase a vector containing structs with std:unique_ptr?
除非对 clear() 向量行进行注释,否则下一个源代码甚至无法编译。谁能向我解释为什么以及如何解决它?
#include <vector>
class Class
{
public:
typedef std::unique_ptr<int> Variable;
public:
Class() {}
Class(Class&& other) { variables = std::move(other.variables); }
private:
std::vector<Variable> variables;
};
void main()
{
std::vector<Class> container;
container.push_back(Class());
container.clear();
}
我必须指出,它已经在MS Visual Studio 2010 编译器中进行了尝试(可以说它是一个半c++11 实现)。遗憾的是我还没有找到任何允许使用 VS 2010 的在线编译器。
不管怎样,报错如下:
1>------ Operación Generar iniciada: proyecto: Binary, configuración: Debug Win32 ------
1>Compilación iniciada a las 30/05/2018 13:28:52.
1>InitializeBuildStatus:
1> Aplicando tarea Touch a "Debug\Binary.unsuccessfulbuild".
1>ClCompile:
1> Main.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2156): error C2248: 'std::unique_ptr<_Ty>::operator =' : no se puede obtener acceso al miembro private miembro declarado en la clase 'std::unique_ptr<_Ty>'
1> with
1> [
1> _Ty=int
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(2352) : vea la declaración de 'std::unique_ptr<_Ty>::operator ='
1> with
1> [
1> _Ty=int
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2177) : vea la referencia a la creación de instancias de plantilla de función '_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' que se está compilando
1> with
1> [
1> _OutIt=std::unique_ptr<int> *,
1> _InIt=std::unique_ptr<int> *
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(719) : vea la referencia a la creación de instancias de plantilla de función '_OutIt std::_Copy_impl<std::unique_ptr<_Ty>*,std::unique_ptr<_Ty>*>(_InIt,_InIt,_OutIt)' que se está compilando
1> with
1> [
1> _OutIt=std::unique_ptr<int> *,
1> _Ty=int,
1> _InIt=std::unique_ptr<int> *
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(709) : durante la compilación de la función miembro de plantilla de clase 'std::vector<_Ty> &std::vector<_Ty>::operator =(const std::vector<_Ty> &)'
1> with
1> [
1> _Ty=Class::Variable
1> ]
1> c:\vc\protocolreader\main.cpp(13) : vea la referencia a la creación de instancias de plantilla de clase 'std::vector<_Ty>' que se está compilando
1> with
1> [
1> _Ty=Class::Variable
1> ]
1>
1>ERROR al compilar.
1>
1>Tiempo transcurrido 00:00:01.09
========== Generar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========
如果需要,您可以使用在线服务将其从西班牙语翻译成英语。
您需要为 Class
实施移动分配:
Class& operator=(Class&& other)
{
variables = std::move(other.variables);
return *this;
}
代码无法编译,因为 Class
的复制赋值运算符不可用,因为它包含不可复制的成员。现代编译器会使用默认生成的移动赋值运算符,但是,Visual Studio 2010 不这样做。
除非对 clear() 向量行进行注释,否则下一个源代码甚至无法编译。谁能向我解释为什么以及如何解决它?
#include <vector>
class Class
{
public:
typedef std::unique_ptr<int> Variable;
public:
Class() {}
Class(Class&& other) { variables = std::move(other.variables); }
private:
std::vector<Variable> variables;
};
void main()
{
std::vector<Class> container;
container.push_back(Class());
container.clear();
}
我必须指出,它已经在MS Visual Studio 2010 编译器中进行了尝试(可以说它是一个半c++11 实现)。遗憾的是我还没有找到任何允许使用 VS 2010 的在线编译器。
不管怎样,报错如下:
1>------ Operación Generar iniciada: proyecto: Binary, configuración: Debug Win32 ------
1>Compilación iniciada a las 30/05/2018 13:28:52.
1>InitializeBuildStatus:
1> Aplicando tarea Touch a "Debug\Binary.unsuccessfulbuild".
1>ClCompile:
1> Main.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2156): error C2248: 'std::unique_ptr<_Ty>::operator =' : no se puede obtener acceso al miembro private miembro declarado en la clase 'std::unique_ptr<_Ty>'
1> with
1> [
1> _Ty=int
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(2352) : vea la declaración de 'std::unique_ptr<_Ty>::operator ='
1> with
1> [
1> _Ty=int
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2177) : vea la referencia a la creación de instancias de plantilla de función '_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' que se está compilando
1> with
1> [
1> _OutIt=std::unique_ptr<int> *,
1> _InIt=std::unique_ptr<int> *
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(719) : vea la referencia a la creación de instancias de plantilla de función '_OutIt std::_Copy_impl<std::unique_ptr<_Ty>*,std::unique_ptr<_Ty>*>(_InIt,_InIt,_OutIt)' que se está compilando
1> with
1> [
1> _OutIt=std::unique_ptr<int> *,
1> _Ty=int,
1> _InIt=std::unique_ptr<int> *
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(709) : durante la compilación de la función miembro de plantilla de clase 'std::vector<_Ty> &std::vector<_Ty>::operator =(const std::vector<_Ty> &)'
1> with
1> [
1> _Ty=Class::Variable
1> ]
1> c:\vc\protocolreader\main.cpp(13) : vea la referencia a la creación de instancias de plantilla de clase 'std::vector<_Ty>' que se está compilando
1> with
1> [
1> _Ty=Class::Variable
1> ]
1>
1>ERROR al compilar.
1>
1>Tiempo transcurrido 00:00:01.09
========== Generar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========
如果需要,您可以使用在线服务将其从西班牙语翻译成英语。
您需要为 Class
实施移动分配:
Class& operator=(Class&& other)
{
variables = std::move(other.variables);
return *this;
}
代码无法编译,因为 Class
的复制赋值运算符不可用,因为它包含不可复制的成员。现代编译器会使用默认生成的移动赋值运算符,但是,Visual Studio 2010 不这样做。