Как стереть вектор, содержащий структуры, с помощью std: unique_ptr? - PullRequest
0 голосов
/ 30 мая 2018

Следующий исходный код даже не скомпилируется, если строка вектора 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 ==========

Пожалуйста, вы можете использовать онлайн-сервис для его перевода наанглийский с испанского, если вам нужно.

1 Ответ

0 голосов
/ 30 мая 2018

Необходимо реализовать назначение перемещения для Class:

Class& operator=(Class&& other)
{
    variables = std::move(other.variables);
    return *this;
}

Код не компилируется, поскольку оператор назначения копирования Class недоступен, так как содержит не подлежащий копированиючлен.Современные компиляторы вместо этого используют сгенерированный по умолчанию оператор присваивания перемещения, однако Visual Studio 2010 этого не делает.

...