Saltar al contenido

Error del compilador de C++ C2280 “intentando hacer referencia a una función eliminada” en Visual Studio 2013 y 2015

Estate atento ya que en esta sección hallarás el arreglo que buscas.

Solución:

De [class.copy]/7, énfasis mío:

Si la definición de clase no declara explícitamente un constructor de copias, uno no explícito se declara implícitamente.
Si la definición de clase declara un constructor de movimiento o un operador de asignación de movimiento, el constructor de copia declarado implícitamente se define como eliminado; de lo contrario, se define como predeterminado (8.4). El último caso está en desuso si la clase tiene un operador de asignación de copia declarado por el usuario o un destructor declarado por el usuario.

Hay una sección equivalente con una redacción similar para la tarea de copia en el párrafo 18. Entonces, su clase es realmente:

class A

public:
   // explicit
   A()
   A(A &&)

   // implicit
   A(const A&) = delete;
   A& operator=(const A&) = delete;
;

por eso no se puede copiar-construir. Si proporciona un constructor/asignación de movimiento, y aún desea que la clase se pueda copiar, deberá proporcionar explícitamente esas funciones de miembros especiales:

    A(const A&) = default;
    A& operator=(const A&) = default;

También deberá declarar un operador de asignación de movimiento. Si realmente necesita estas funciones especiales, probablemente también necesitará el destructor. Ver Regla de cinco.

Tuve el mismo problema y se debió a una variable miembro mal definida:

double const deltaBase = .001;

Poner esto hará que se elimine el constructor de copia. Deshágase de la “const” y asigne en el constructor.

Si escribe un constructor de movimiento definido por el usuario para su clase, el constructor de copia se eliminará. Esto se debe a que si una clase necesita un comportamiento especial para su constructor de movimiento, probablemente necesite un comportamiento similar en su constructor de copia, por lo que el constructor de copia se eliminará para evitar que use inadvertidamente el comportamiento predeterminado.

Si desea definir su propio constructor de movimiento y use el constructor de copia predeterminado, debe declararlo como defaultcomo sugieres en tu pregunta:

class A

public:
   A()
   A(A &&)
   //I know what I'm doing, compiler, use the default version.
   A(const A&)=default;
;

Tenga en cuenta que si define un constructor de movimiento personalizado, también debe pensar en sus operadores de asignación y destructor.

Te mostramos las comentarios y valoraciones de los lectores

Tienes la posibilidad dar visibilidad a este artículo si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *