c++ gcc g++ c++11 deleted-functions

c++ - error: uso de la función eliminada



gcc g++ (6)

¿Puedes probar esto, por favor? No tengo gcc-4.6

class C { public: const int x ; } ; int main() { C c ; }

Debería dar un mensaje de error similar si las personas aquí son correctas.

He estado trabajando en un código C ++ que un amigo ha escrito y obtengo el siguiente error que nunca he visto antes 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 utiliza MSM de impulso: página web de Boost

Edit2: No hay = delete() utilizado en cualquier lugar en el código fuente.

En términos generales, ¿qué significa este error? ¿Qué debería estar buscando cuando ocurre este tipo de error?


El cambio de gcc 4.6 a gcc 4.8 resolvió esto para mí.


En el estándar actual de C ++ 0x, puede deshabilitar explícitamente los constructores por defecto con la sintaxis de eliminación, por ejemplo

MyClass() = delete;

Gcc 4.6 es la primera versión que admite esta sintaxis, por lo que quizás ese sea el problema ...


Está utilizando una función, que está marcada como deleted .
P.ej:

int doSomething( int ) = delete;

The = delete es una nueva característica de C ++ 0x. Significa que el compilador debe detener inmediatamente la compilación 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 función para =delete .

Para saber más sobre esta nueva característica introducida en C ++ 0x, mira this .


No creo que las otras respuestas mencionen el =deleted; la sintaxis es correcta El mensaje de error dice claramente que el constructor predeterminado ha sido eliminado implícitamente . Incluso dice por qué: la clase contiene una variable const no estática, que no sería inicializada por el ctor predeterminado.

class X { const int x; };

Como X::x es const , debe inicializarse, pero un ctor predeterminado normalmente no lo inicializaría (porque es un tipo de POD). Por lo tanto, para obtener un ctor predeterminado, necesita definir uno usted mismo (y debe inicializar x ). Puede obtener el mismo tipo de situación con un miembro que sea una referencia:

class X { whatever &x; };

Probablemente valga la pena señalar que ambos también desactivarán la creación implícita de un operador de asignación, y por la misma razón. El operador de asignación implícita normalmente hace la asignación de miembros, pero en estos casos no puede porque el miembro es uno que 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 cual un miembro const generalmente debe ser estático: cuando realiza una tarea, no puede asignar el miembro const 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 única variable en lugar de tener muchas copias de una variable que tendrán el mismo valor.

Sin embargo, es posible crear instancias con diferentes valores: 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 así como intercambiarlos, el miembro de la estructura retendrá su valor original en lugar de ser intercambiado.


gcc 4.6 admite una nueva función de funciones eliminadas, donde puede escribir

hdealt() = delete;

para deshabilitar el constructor predeterminado.

Aquí el compilador obviamente ha visto que no se puede generar un constructor predeterminado, y =delete por usted.