it-swarm.com.de

using enum sagt ungültige Konvertierung von 'int' in 'type'

In meiner Klasse definierte ich eine Enumeration wie folgt:

class myClass 
{
 public:
    enum access {
      forL,
      forM,
      forA
    };
    typedef access AccessType;
    AccessType aType;
};

Später wurde ein Objekt wie folgt definiert:

myClass ob;
ob->aType = 0;

Ich erhalte jedoch diesen Fehler:

 Fehler: Ungültige Konvertierung von 'int' in 'myClass :: AccessType {aka myClass :: access}' [-fpermissive] 

Keine Enumerationsfelder für Ganzzahlen zuordnen?

23
mahmood

Nein, sie werden als Ganzzahlen gespeichert, es handelt sich jedoch um unterschiedliche Typen (z. B. können Sie sogar den Enummentyp überladen). Sie müssen explizit konvertieren:

myClass ob;
ob->aType = (myClass::AccessType)0;

oder schreiben Sie besser den entsprechenden benannten Wert der Enumeration:

myClass ob;
ob->aType = myClass::forL;

Oder ändern Sie den Typ des Feldes, wenn Sie die Aufzählung nur als Menge von Ganzzahlkonstanten verwenden möchten:

class myClass 
{
 public:
    enum {
      forL,
      forM,
      forA
    };
    int aType; // just stores numbers
};

Die Konvertierung von Enum nach Int ist implizit.

20
ybungalobill

Enumerationsmember werden durch ganzzahlige Werte gesichert, es erfolgt jedoch keine implizite -Konvertierung von einer Ganzzahl in einen Aufzählungstyp. Sie müssen eine explizite Besetzung verwenden, wenn Sie sie wirklich so schreiben möchten:

ob->aType = static_cast<myClass::access>(0);
9
bobbymcr

Eine implizite Umwandlung von int -> enum ist nicht möglich, da zum Zeitpunkt der Kompilierung keine Möglichkeit besteht, zu wissen, ob die Umwandlung gültig ist.

Sie can führen implizite Umsetzungen in die andere Richtung durch, so dass Sie (wenn Sie wollten)

int foo = forL;
3
rejj

Ich hatte gerade das gleiche Problem. Ich muss ein Objekt aus dem, was ich in einer XML-Datei gelesen habe, initialisieren, und ich habe keine Kontrolle darüber, was mit dieser Datei passieren könnte. 

Konstruktor hat eine Aufzählung als Argument: 

enum status_t { NOT_STARTED, STARTED, DONE };
MyObject::MyObject(int id, status_t status) : m_id(id), m_status(status){}

Wenn ich also die Xml parse, muss ich sie umsetzen. Ich habe es dann vorgezogen, die Besetzung im Konstruktor zu behandeln, damit die anderen Klassen nicht wissen müssen, welches das gültige Enum ist.

MyObject::MyObject(int id, int status) : m_id(id){
    m_status = status_t(status);
}

Es kann jedoch nicht sichergestellt werden, dass der von xml kommende Wert im richtigen Bereich liegt.

Hier ist die Lösung, mit der ich gekommen bin:

MyObject::MyObject(int id, int status) : m_id(id){
    switch(status){
        case NOT_STARTED:
        case STARTED:
        case DONE:
            m_status=status_t(status);
            break;
        default:
            m_status=NOT_STARTED;
            break;
    }
}

Dies ist eine Implementierungsoption, um bei nicht konsistenten Daten einen Standardwert zu erzwingen. Man könnte es vorziehen, eine Ausnahme auszuwerfen, in meinem Fall wird dies auf diese Weise geschehen. 

0
Pellekrino