2014-09-01 2 views
5

folgender Code gibt einen Übersetzungsfehler (zumindest bei der Verwendung von MS VS 2008) für Zeile "e = f" in main():Fehler C2582: 'operator =' Funktion in 'B' nicht zur Verfügung steht

Fehler C2582: 'Operator =' Funktion ist nicht verfügbar in 'B'

class A { 
public: 
    A() { } 
    static const double x; 
}; 
const double A::x = 0.0; 

class B { 
public: 
    B() : x(0.0) { } 
    const double x; 
}; 

int main(int argc, char *argv[]) 
{ 
    A c,d; 
    B e,f; 

    c = d; 
    e = f; 

    return 0; 
} 

Der Standardzuweisungsoperator für beide Klassen A und B erzeugt werden sollte!?

in 12.8.10: „Wenn die Klassendefinition explizit keine Kopie Zuweisungsoperator erklären, wird ein implizit deklariert.“

Antwort

14

Der implizit generierte Operator würde jedes nicht statische Element rekursiv zuweisen. x ist jedoch const, daher kann es nicht zugewiesen werden. Dies verhindert, dass der implizite Operator erzeugt wird (insbesondere bewirkt er, dass er als gelöscht definiert wird).

Dies spezifiziert in C++ wird 11 12,8/23:

A ausgefallener Kopieren/Verschieben Zuweisungsoperator für Klasse X definiert ist als gelöscht, wenn X hat:

  • ...
  • ein nicht-statisches Datenelement von const nicht-Klasse-Typ (oder Array davon) oder
  • ...

(Obwohl ich gerade festgestellt habe, dass Ihr Compiler C++ 11 vorausgeht; Die Regeln sind ähnlich, aber in verschiedenen Sprachen angegeben, in älteren Dialekten ohne "gelöschte" Funktionen.

Wenn Sie einen Zuweisungsoperator für eine Klasse wünschen, deren Mitglieder (oder Basisklassen) nicht neu zugeordnet werden können, müssen Sie sie selbst definieren.

In class A ist das konstante Element statisch und bildet daher keinen Teil eines Objekts. Daher wird nicht verhindert, dass ein (leeres) Objekt zugewiesen wird.

2

Der offensichtliche Unterschied zwischen Klasse A und B ist, dass das Element x statisch vs. nicht statisch ist. Die Zuweisung zu einer const-Variablen ist/sollte in jedem Fall unmöglich sein.

Der Compiler versucht offensichtlich, die Standardzuweisungsoperatormethode für Klasse B zu generieren, und beschließt stillschweigend, keine zu generieren, da Element x keine Zuweisung zulässt.

habe mir eine recht lange Zeit, dies herauszufinden ...

BTW: Wenn Sie die Initialisierung von x in der Klasse B weglassen, Compiler ist intelligent genug, diesen Fehler zu erfahren.

+4

Ja Sie Ihre eigene Frage beantwortet.Sie erhalten ein Abzeichen (aber keine Wiederholung), wenn Sie Ihre Antwort akzeptieren. – CashCow

4

Feld 'x' ist von const qualifizierter Art von const double, der Standard-Zuweisungsoperator bedeutungslos sein wird und ist implizit gelöscht hier

Verwandte Themen