Aviso do compilador (nível 4) C4512
"classe": não foi possível gerar um operador de atribuição
O compilador não pode gerar um operador de atribuição para uma determinada classe. Nenhum operador de atribuição foi criado.
O fato de um operador de atribuição para a classe de base não estar acessível pela classe derivada, pode fazer causar esse aviso.
Para evitar esse aviso, especifique um operador de atribuição definido pelo usuário para a classe.
O compilador também gerará uma função de operador de atribuição para uma classe que não define uma. Este operador de atribuição é uma cópia de reconhecimento de membro dos membros de dados de um objeto. Como os itens de dados const
não podem ser modificados após a inicialização, se a classe tiver um item const
, o operador de atribuição padrão não funcionará. Outra causa do aviso C4512 é uma declaração de um membro de dados não estático do tipo de referência. Se a intenção é criar um tipo não copiado, você também deve evitar a criação de um construtor de cópia padrão.
Você pode resolver o aviso C4512 para o código de uma destas três maneiras:
Defina explicitamente um operador de atribuição para a classe.
Remova
const
ou o operador de referência do item de dados na classe.Use a instrução warning #pragma para suprimir o aviso.
Exemplo
O seguinte exemplo gera C4512.
// C4512.cpp
// compile with: /EHsc /W4
// processor: x86
class Base {
private:
const int a;
public:
Base(int val = 0) : a(val) {}
int get_a() { return a; }
}; // C4512 warning
class Base2 {
private:
const int a;
public:
Base2(int val = 0) : a(val) {}
Base2 & operator=( const Base2 & ) { return *this; }
int get_a() { return a; }
};
// Type designer intends this to be non-copyable because it has a
// reference member
class Base3
{
private:
char& cr;
public:
Base3(char& r) : cr(r) {}
// Uncomment the following line to explicitly disable copying:
// Base3(const Base3&) = delete;
}; // C4512 warning
int main() {
Base first;
Base second;
// OK
Base2 first2;
Base2 second2;
char c = 'x';
Base3 first3(c);
Base3 second3 = first3; // C2280 if no default copy ctor
}