Udostępnij przez


Ostrzeżenie kompilatora (poziom 4) C4512

"class" : nie można wygenerować operatora przypisania

Kompilator nie może wygenerować operatora przypisania dla danej klasy. Nie utworzono operatora przypisania.

Operator przypisania dla klasy bazowej, który nie jest dostępny dla klasy pochodnej, może spowodować to ostrzeżenie.

Aby uniknąć tego ostrzeżenia, określ operator przypisania zdefiniowanego przez użytkownika dla klasy.

Kompilator wygeneruje również funkcję operatora przypisania dla klasy, która nie definiuje tej funkcji. Ten operator przypisania jest kopią składową elementów członkowskich obiektu. Ponieważ const nie można modyfikować elementów danych po zainicjowaniu, jeśli klasa zawiera const element, domyślny operator przypisania nie będzie działać. Inną przyczyną ostrzeżenia C4512 jest deklaracja niestatycznego elementu członkowskiego danych typu odwołania. Jeśli intencją jest utworzenie typu nie kopiowalnego, należy również uniemożliwić utworzenie domyślnego konstruktora kopiowania.

Ostrzeżenie C4512 dla kodu można rozwiązać na jeden z trzech sposobów:

  • Jawnie zdefiniuj operator przypisania dla klasy.

  • Usuń const lub operator odwołania z elementu danych w klasie.

  • Użyj instrukcji ostrzeżenia #pragma, aby pominąć ostrzeżenie.

Przykład

Poniższy przykład generuje 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
}