Problem mit enum - ungültige Umwandlung von "int"



  • Ich habe hier Code den ich von Borland C++ nach GCC 4.3.3 portieren soll und bekomme beim Compilieren folgende Fehlermeldung:

    Fehler: ungültige Umwandlung von »int« in »BlubbLib::AttributeState«
    

    Irgendwie stehe ich hier auf dem Schlauch... kann mir hier einer einen sachdienlichen Hinweis zu geben?

    AttrData Data;
    Data.State = stContinuous | stForcedContinuous | stChangeable;
    
    struct AttrData
    {
      ItemValue      *List;   
      size_t          Size;   
      ItemValue       Name;   
      AttributeState  State;
    
    enum AttributeState
    {
      stContinuous       = 0x01,      
      stForcedContinuous = 0x02,      
      stDiscrete         = 0x04,      
      stForcedDiscrete   = 0x08,      
      stChangeable       = 0x10,      
      stIgnore           = 0x20,      
      stClass            = 0x40       
    };
    


  • Wenn du die enums mit | verbindest erhälst du was was nicht mehr in deiner enum deklaration drinne ist ... Mach int draus 🙂



  • Heimwerkerking schrieb:

    Ich habe hier Code den ich von Borland C++ nach GCC 4.3.3 portieren soll und bekomme beim Compilieren folgende Fehlermeldung:

    Fehler: ungültige Umwandlung von »int« in »BlubbLib::AttributeState«
    

    Der auch vollkommen richtig ist. Ein enum lässt genau die Werte zu, die angegeben werden. Ändere AttrData.State testweise in einen int ab... Besser wäre aber eine typsichere Umsetzung.

    cu André


  • Administrator

    AttrData Data; 
    Data.State = stContinuous | stForcedContinuous | stChangeable;
    

    Bei dieser Bitoperation werden die Enum-Werte in Integer-Werte umgewandelt, da ein Enum-Wert keine Bitoperation versteht. Dies geschieht implizit. Das Resultat von diesen Operationen ist somit ein Integer-Wert, welcher dann wieder dem Enum-Wert zugeordnet werden soll.
    Mich erstaunt es ein wenig, dass dies ein Fehler gibt, bei mir resultiert dies meistens nur in eine Warnung. Am einfachsten definierst du AttrData::State als int . Der resultierende Wert kommt schliesslich gar nicht mehr im Enum vor.

    Grüssli



  • asc schrieb:

    Der auch vollkommen richtig ist. Ein enum lässt genau die Werte zu, die angegeben werden. Ändere AttrData.State testweise in einen int ab... Besser wäre aber eine typsichere Umsetzung.

    cu André

    Und wie soll das typsicher aussehen? const int statt enum oder wie? 🙄



  • Hmmmm, danke erst mal.
    Ich frag mich dann nur wie konnte das vorher mit dem Borland Compiler compilieren...


  • Administrator

    Heimwerkerking schrieb:

    Hmmmm, danke erst mal.
    Ich frag mich dann nur wie konnte das vorher mit dem Borland Compiler compilieren...

    Es gibt kein Gesetz, welches einem Kompiler vorschreibt, dass er sich genau gleich an den Standard halten muss, wie andere Kompiler 😉
    Zwischen den Kompilern gibt es oft Unterschiede, die meistens halten sich eigentlich nicht zu 100% an den Standard. Dies beweist schon nur das Fehlen von "Export Templates" bei den meisten Kompilern. Die Welt wäre wohl zu schön, wenn alle so brav wären 🙂

    Grüssli



  • also wieder nur die blöde Compiler Falle...



  • quarktasche schrieb:

    Und wie soll das typsicher aussehen? const int statt enum oder wie? 🙄

    Nein, beispielsweise über ein bitset, oder eine kleine Klasse die ähnlich wie ein int aufgebaut ist, aber grundsätzlich noch Wertebereiche prüft. Sofern der int-wert aber nicht von jeden geändert werden kann wäre der Aufwand vermutlich übertrieben.



  • Nett ist auch im VC bis 7.1 folgendes

    #include <iostream>
    
    int main()
    {
      for( int i = 0; i < 10; ++i )
         std::cout << i << std::endl;
    
      std::cout << "Jetz ist i = " << i << std::endl;
    }
    

    In VC 8 kann man es noch einschalten (ANSI Erweiterung oder so ähnlich nennt sich das), beim aktuellsten weiß ich es nicht.



  • Tippgeber schrieb:

    Nett ist auch im VC bis 7.1 folgendes

    #include <iostream>
    
    int main()
    {
      for( int i = 0; i < 10; ++i )
         std::cout << i << std::endl;
    
      std::cout << "Jetz ist i = " << i << std::endl;
    }
    

    In VC 8 kann man es noch einschalten (ANSI Erweiterung oder so ähnlich nennt sich das), beim aktuellsten weiß ich es nicht.

    Und was hat diese grauenhafte Eigenschaft mit diesem Thema zu tun?



  • Tippgeber schrieb:

    Nett ist auch im VC bis 7.1 folgendes

    Also nett mit Sicherheit nicht, und ich wüsste auch nicht das sich dieser Code noch im Visual Studio 2003+ kompilieren lassen würde (Ohne explizit die "Spracherweiterungen" zu aktivieren). Habe aber inzwischen weder den 2003 noch 2005 installiert (Und werde ich alleine zum Ausprobieren auch nicht machen).

    Unter 2008 kompiliert dies ohne Änderungen an den Projekteinstellungen zum Glück nicht.


Log in to reply