enum Forwärtsdeklarationen



  • Sind enum Forwärtsdeklarationen Teil des Standards?

    Damit wäre sowas wie folgendes definiert:

    enum myenum;
    
    class MyClass
    {
      public:
       myenum foo();
    };
    


  • wie oben: "use of enum `myenum' without previous declaration"

    #include <iostream>
    
    enum weekday { Mo, Di, Mi, Do, Fr, Sa, So };
    
    class MyClass
    {
      public:
       weekday foo()
       {
         return Do;
       }
    };
    
    int main()
    {
     MyClass x;
     std::cout << x.foo();
    }
    

    Bei der Ausgabe nach cout wird der Aufzählungstyp durch die sogenannte „integrale Promotion“ automatisch in eine Ganzzahl umgewandelt.



  • Der vc schluckt es und der comeau kommt damit auch klar, was für einen compiler hast du da verwendet?

    Mein Problem ist, dass das enum natürlich nicht von mir ist sondern aus einer Bibliothek und möchte möglichst das inkludieren des headers vermeiden.



  • thomas r. schrieb:

    Mein Problem ist, dass das enum natürlich nicht von mir ist sondern aus einer Bibliothek und möchte möglichst das inkludieren des headers vermeiden.

    Wozu?!



  • .filmor schrieb:

    thomas r. schrieb:

    Mein Problem ist, dass das enum natürlich nicht von mir ist sondern aus einer Bibliothek und möchte möglichst das inkludieren des headers vermeiden.

    Wozu?!

    warum inkludier man die <windows.h> nicht im header, sondern erst im implemetierungsfile?
    genau, weil damit die übersetungszeit des projekts verzehnfacht wird.



  • volkard schrieb:

    .filmor schrieb:

    thomas r. schrieb:

    Mein Problem ist, dass das enum natürlich nicht von mir ist sondern aus einer Bibliothek und möchte möglichst das inkludieren des headers vermeiden.

    Wozu?!

    warum inkludier man die <windows.h> nicht im header, sondern erst im implemetierungsfile?
    genau, weil damit die übersetungszeit des projekts verzehnfacht wird.

    Ich inkludiere die windows.h gar nicht :p. Im Ernst, wenn da nicht mit Metaprogrammen rumgewurschtelt wird sollte das doch kein großes Problem darstellen, oder?


  • Mod

    Thomas R. schrieb:

    Sind enum Forwärtsdeklarationen Teil des Standards?

    Damit wäre sowas wie folgendes definiert:

    enum myenum;
    
    class MyClass
    {
      public:
       myenum foo();
    };
    

    er standard selbst kennt nur deklarationen. forwärtsdeklaration ist ein informeller begriff. in funktionsdeklarationen außerhalb einer templatedeklaration muss ein typ nur dann vollständig (d.h. an dieser stelle definiert) sein, wenn er in einem ausdruck, der als defaultargument dienen soll, gebraucht wird, oder wenn auf einen darin verschachtelten bezeichner zugegriffen wird. das ist hier nicht der fall, also ist an diesem stück code nichts auszusetzen.



  • Wenn das enum aus einer externen Library stammt, kann es evtl. auch sein, daß dieses in einem anderen Namespace deklariert ist, d.h als Vorwärtsdefinition müßte dann folgendes geschrieben werden:

    namespace NExtLib   // <-- hier richtigen Namen einsetzen
    {
       enum myenum;
    }
    
    class MyClass
    {
      public:
       NExtLib::myenum foo();
    };
    

    Schlimmer ist es, wenn ein enum als (public) Teil einer Klasse definiert wurde.
    Dann kommt man um das Inkludieren des Headers nicht herum...



  • OT, aber: Warum volgt eigentlich jetzt jeder dem OP und schreibt Forwärts?!?



  • Besonders fein sind die Forwärtsdefinitionen 😉
    Bitte das nächste mal mit Pfogel Pfau.



  • .filmor schrieb:

    Besonders fein sind die Forwärtsdefinitionen 😉
    Bitte das nächste mal mit Pfogel Pfau.

    Forwärtsdevinitionen??? 🤡



  • Hoppla ist mir gar nicht aufgefallen 🤡

    Wollte ursprünglich forward declaration schreiben, aber dachte mir dann wenn es nen deutsches Wort gibt, dann nehme ich das auch. Peinlich peinlich 🤡



  • Dev-C++



  • Forward-Declarations sind nur auf Klassentypen (class, struct, union) erlaubt. Die Deklarations-Syntax für einen Enum [dcl.enum] erlaubt ein Konstrukt á la enum identifier; nicht.


Log in to reply