如何用 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 不这样做。