He estado trabajando en un código C ++ que ha escrito un amigo y obtengo el siguiente error que nunca antes había visto al compilar con gcc4.6:
error: use of deleted function
‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’
Editar: Esto proviene de una parte del código que usa boost MSM: Boost Webpage
Edit2: No se = delete()
utiliza en ninguna parte del código fuente.
En términos generales, ¿qué significa este error? ¿Qué debo buscar cuando se produce este tipo de error?
Respuestas:
El mensaje de error dice claramente que el constructor predeterminado se ha eliminado implícitamente . Incluso dice por qué: la clase contiene una variable constante, no estática, que no sería inicializada por el ctor predeterminado.
Como
X::x
esconst
, debe inicializarse, pero un ctor predeterminado normalmente no lo inicializaría (porque es un tipo POD). Por lo tanto, para obtener un ctor predeterminado, debe definir uno usted mismo (y debe inicializarsex
). Puede tener el mismo tipo de situación con un miembro que es una referencia:Probablemente valga la pena señalar que ambos también deshabilitarán la creación implícita de un operador de asignación, esencialmente por la misma razón. El operador de asignación implícita normalmente realiza asignaciones por miembros, pero con un miembro constante o un miembro de referencia, no puede hacerlo porque el miembro no se puede asignar. Para que la asignación funcione, debe escribir su propio operador de asignación.
Esta es la razón por la que un
const
miembro normalmente debe ser estático: cuando haces una asignación, no puedes asignar el miembro constante de todos modos. En un caso típico, todas sus instancias tendrán el mismo valor, por lo que también podrían compartir el acceso a una sola variable en lugar de tener muchas copias de una variable que tendrán el mismo valor.Sin embargo, es posible, por supuesto, crear instancias con valores diferentes: usted (por ejemplo) pasa un valor cuando crea el objeto, por lo que dos objetos diferentes pueden tener dos valores diferentes. Sin embargo, si intenta hacer algo como intercambiarlos, el miembro const conservará su valor original en lugar de intercambiarse.
fuente
C++ error: use of deleted function
Está utilizando una función, que está marcada como
deleted
.P.ej:
= Delete es una nueva característica de C ++ 0x. Significa que el compilador debe dejar de compilar inmediatamente y quejarse de que "esta función se elimina" una vez que el usuario usa dicha función.
Si ve este error, debe verificar la declaración de la función
=delete
.Para saber más sobre esta nueva característica introducida en C ++ 0x, consulte esto .
fuente
C++ error: use of deleted function
gcc 4.6 admite una nueva característica de funciones eliminadas, donde puede escribir
para deshabilitar el constructor predeterminado.
Aquí el compilador obviamente ha visto que no se puede generar un constructor predeterminado, y
=delete
lo hizo por usted.fuente
Encontré este error al heredar de una clase abstracta y no implementar todos los métodos virtuales puros en mi subclase.
fuente
public virtual
de una clase base de segundo nivel donde la clase base de primer nivel tenía un constructor predeterminado eliminado explícitamente. La eliminaciónvirtual
solucionó el problema sin tener que implementar todos los métodos.En el estándar C ++ 0x actual, puede deshabilitar explícitamente los constructores predeterminados con la sintaxis de eliminación, por ejemplo
Gcc 4.6 es la primera versión que admite esta sintaxis, así que quizás ese sea el problema ...
fuente
Gcc 4.6 is the first version to support this syntax
Supongo que eso explicaría por qué nunca lo había visto antes, ya que recién comencé a usar gcc4.6.Cambiar de gcc 4.6 a gcc 4.8 resolvió esto por mí.
fuente