Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
"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ń
constlub 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
}