Tenho trabalhado em alguns códigos C ++ que um amigo escreveu e recebo o seguinte erro que nunca vi antes ao compilar com 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’
Edit: Isso vem de uma parte do código usando boost MSM: Boost Webpage
Edit2: Não é = delete()
usado em nenhum lugar no código-fonte.
De modo geral, o que significa esse erro? O que devo procurar quando esse tipo de erro ocorrer?
Respostas:
A mensagem de erro diz claramente que o construtor padrão foi excluído implicitamente . Ele até diz o porquê: a classe contém uma variável const não estática, que não seria inicializada pelo ctor padrão.
Desde
X::x
éconst
, ele deve ser inicializado - mas um ctor padrão normalmente não inicializá-lo (porque é um tipo POD). Portanto, para obter um ctor padrão, você precisa definir um (e ele deve inicializarx
). Você pode ter o mesmo tipo de situação com um membro que é uma referência:Provavelmente, vale a pena notar que ambos também desabilitarão a criação implícita de um operador de atribuição, essencialmente pelo mesmo motivo. O operador de atribuição implícita normalmente faz a atribuição de membros, mas com um membro const ou membro de referência, ele não pode fazer isso porque o membro não pode ser atribuído. Para fazer a atribuição funcionar, você precisa escrever seu próprio operador de atribuição.
É por isso que um
const
membro normalmente deve ser estático - quando você faz uma atribuição, você não pode atribuir o membro const de qualquer maneira. Em um caso típico, todas as suas instâncias terão o mesmo valor, então elas também podem compartilhar o acesso a uma única variável em vez de ter muitas cópias de uma variável que terá o mesmo valor.É possível, claro, criar instâncias com valores diferentes - você (por exemplo) passa um valor ao criar o objeto, então dois objetos diferentes podem ter dois valores diferentes. Se, entretanto, você tentar fazer algo como trocá-los, o membro const manterá seu valor original em vez de ser trocado.
fonte
C++ error: use of deleted function
Você está usando uma função marcada como
deleted
.Por exemplo:
O = delete é um novo recurso do C ++ 0x. Isso significa que o compilador deve parar imediatamente de compilar e reclamar "esta função foi excluída" assim que o usuário usar essa função.
Se você vir esse erro, deve verificar a declaração da função para
=delete
.Para saber mais sobre este novo recurso introduzido em C ++ 0x, verifique isto .
fonte
C++ error: use of deleted function
gcc 4.6 suporta um novo recurso de funções excluídas, onde você pode escrever
para desativar o construtor padrão.
Aqui, o compilador obviamente viu que um construtor padrão não pode ser gerado e
=delete
o fez para você.fonte
Encontrei esse erro ao herdar de uma classe abstrata e não implementar todos os métodos virtuais puros em minha subclasse.
fonte
public virtual
de uma classe base de 2º nível, onde a classe base de 1º nível tinha um construtor padrão explicitamente excluído. A remoçãovirtual
corrigiu o problema sem a necessidade de implementar todos os métodos.No padrão C ++ 0x atual, você pode desabilitar explicitamente os construtores padrão com a sintaxe de exclusão, por exemplo
Gcc 4.6 é a primeira versão a suportar esta sintaxe, então talvez seja esse o problema ...
fonte
Gcc 4.6 is the first version to support this syntax
Acho que isso explicaria por que nunca o vi antes, pois comecei a usar o gcc4.6 recentemente.Mudar do gcc 4.6 para o gcc 4.8 resolveu isso para mim.
fonte