Non-standard extension Warning mit enum
-
Hi,
ich habe folgendes enum:
typedef enum eInitConfig { min=0, own=0, stored=1, max=1, };
Da die darin enthaltenen Bezeichner nicht eindeutig sind und auch andere enums beispielsweise min oder max haben können, übergebe ich diese in der Form eInitConfig::min bzw. eInitConfig::max an eine Methode. Diese Methode ist generisch, d.h. die entsprechenden Parameter können deswegen nicht vom Typ eInitConfig sein sondern sind int.
Und genau da beschwert sich dann der Compiler:
warning C4482: nonstandard extension used: enum 'eInitConfig' used in qualified name
Nur: wie mache ich es unter diesen Umständen besser? Den Typ der Methode kann ich nicht ändern, auch ist eine Überladung keine Option, da ich dann 'zig identische Methoden hätte, die sich nur in ihrem enum-Parametertyp unterscheiden.
-
Was soll das typedef da? Seit C++11 sollte das im Übrigen standard sein, eventuell einfach ignorieren. (Nutzt du die neuste Version deines Compilers?)
-
cooky451 schrieb:
Was soll das typedef da?
Kompatibilität mit anderen Compilerversionen sicherstellen. Ansonsten löst die An- oder Abwesenheit dieses typedef aber mein Problem nicht.
-
Soom schrieb:
Kompatibilität mit anderen Compilerversionen sicherstellen. Ansonsten löst die An- oder Abwesenheit dieses typedef aber mein Problem nicht.
Mit Versionen von vor 1998? oO
-
cooky451 schrieb:
Mit Versionen von vor 1998? oO
Hast du noch irgendwas beizutragen was nicht zur Frage gehört?
-
Soom schrieb:
cooky451 schrieb:
Mit Versionen von vor 1998? oO
Hast du noch irgendwas beizutragen was nicht zur Frage gehört?
Naja, du möchtest die eine Warnung weg haben, schreibst aber "für Kompatibilität mit anderen Compilern" Code, der auf vielen Compilern auch Warnungen auslöst (das typedef). Dabei hast du die Kompatibilität mit anderen Compilern schon längst über den Haufen geworfen, weil ein eInitConfig::max auf anderen Compilern überhaupt nicht compiliert.
Zu deinem Problem: schau mal im Netz nach "C++ typesafe enum", dann findest du eine Möglichkeit, diese Qualifizierung standarkonform hinzubekommen. Das typedef solltest du trotzdem wegwerfen, weil es sich erstens kaum lohnt, uralt-Compiler zu unterstützen, und weil es zweitens bei aktuellen Compilern zu Warnungen führt (z.B. GCC).
Was die Überladung mit den verschiedenen enum-Typen angeht, wären Templates vielleicht nennenswert.
-
Was für Uralt-Compiler sollen das denn sein, für die ein enum-Tag nicht automatisch ein Typ ist? Mit "vor 1998" braucht da keiner ankommen, eher 1988
Man könnte auch Kompatibilität mit C wollen, aber dann ist die Frage so oder so hinfällig.
-
Soom schrieb:
Hast du noch irgendwas beizutragen was nicht zur Frage gehört?
Ja, denn die habe ich im ersten Beitrag ja beantwortet.
-
Ein weiterer Grund, dass ich enum class verwendet habe war übrigens, dass man diese forwarden kann.
-
Ups, falscher Thread.
-
Soom schrieb:
Nur: wie mache ich es unter diesen Umständen besser? Den Typ der Methode kann ich nicht ändern, auch ist eine Überladung keine Option, da ich dann 'zig identische Methoden hätte, die sich nur in ihrem enum-Parametertyp unterscheiden.
C++03 Variante: Bezeichner eindeutig machen.
enum eInitConfig { eInitConfig_min = 0, eInitConfig_own = 0, eInitConfig_stored = 1, eInitConfig_max = 1, };
Oder der grässliche Workaround:
struct eInitConfig { enum eInitConfig_ { min = 0, own = 0, stored = 1, max = 1, }; };
C++11 Variante:
enum class
-
cooky451 schrieb:
Soom schrieb:
Hast du noch irgendwas beizutragen was nicht zur Frage gehört?
Ja, denn die habe ich im ersten Beitrag ja beantwortet.
Nein, hast du nicht. Ob das typedef nun dasteht oder nicht macht keinen Unterschied, die Warnung ist trotzdem da (das hatte ich auch schon geschrieben, nur hast du das vor lauter Klugschiss wohl übersehen). Und bevor du dich mit deinem Halbwissen wieder auf den Compiler rausredest: das Problem tritt mit Visual Studio 2010 in den Default-Einstellungen auf.
-
Soom schrieb:
Und bevor du dich mit deinem Halbwissen wieder auf den Compiler rausredest: das Problem tritt mit Visual Studio 2010 in den Default-Einstellungen auf.
rofl, offensichtlich bist du erst auf Nachfrage in der Lage, weiter als 10 Buchstaben zu lesen. Und raffst selbst dann nicht, dass VS10 weder die neuste Version des Compilers ist, noch enum class unterstützt, noch weiß, dass dieser Code C++11 standardkonform ist.
Also, bevor du die nächste Frage stellst: Lesen lernen.
-
cooky451 schrieb:
rofl, offensichtlich bist du erst auf Nachfrage in der Lage, weiter als 10 Buchstaben zu lesen. Und raffst selbst dann nicht, dass VS10 weder die neuste Version des Compilers ist, noch enum class unterstützt, noch weiß, dass dieser Code C++11 standardkonform ist.
Fällt es dir eigentlich immer so schwer zuzugeben, dass du was nicht weißt/kannst/unrecht hast?
Eine Seite vorher war noch mein Compiler schuld, der deiner Meinung nach von vor 1998 ist, jetzt irritiere ich dich mit Fakten, da ist plötzlich VS2010 nicht mehr zu gebrauchen - was kommt als nächstes? Soll ich VS2025 verwenden, damit deine Theorien zur Realität passen?
@hustbaer: Danke, die Hinweise passen, sind schlüssig, lassen sich verwenden und haben mir weitergeholfen.
-
Soom schrieb:
Fällt es dir eigentlich immer so schwer zuzugeben, dass du was nicht weißt/kannst/unrecht hast?
Nein. Aber du hast ja doch noch nicht lesen gelernt, so wird das nichts.
Soom schrieb:
Eine Seite vorher war noch mein Compiler schuld,
Ist er jetzt ja auch immernoch.
Soom schrieb:
der deiner Meinung nach von vor 1998 ist,
Nein. Der Compiler, bei dem du da ein typedef brauchst, der ist von vor 1998. Gib dich nicht auf, lern Lesen und - . Na Schreiben kannste ja schon.
Soom schrieb:
jetzt irritiere ich dich mit Fakten, da ist plötzlich VS2010 nicht mehr zu gebrauchen
Wieso nicht zu gebrauchen? VS10 weiß schlicht und ergreifend noch nicht, dass das konformer Code ist, weil es beim Release noch nicht abzusehen war. Was ist daran so schwer zu verstehen?
Soom schrieb:
- was kommt als nächstes? Soll ich VS2025 verwenden, damit deine Theorien zur Realität passen?
LOL, Alter. Wenn ich solche Versager-
BlogsPosts lese, roflt es mich rückwärts durchs Treppenhaus meiner Oma.
-
cooky451 schrieb:
LOL, Alter. Wenn ich solche Versager-
BlogsPosts lese, roflt es mich rückwärts durchs Treppenhaus meiner Oma.Soziale Kompetenz bei cooky451: 0,nix
Wenn du jeden Tag von der Schule nach Hause rennen musst, weil dich jetzt selbst die Mädchen aus deiner Klasse regelmäßig verkloppen wollen, dann könnte das genau daran liegen.
-
Kriegt euch wieder ein, und zwar beide. Das ist nicht im "find ich jetzt nich OK"-Stil von antiautoritären Muttis gemeint.
-
Schließ den Thread doch einfach, die Frage ist seit dem ersten Beitrag geklärt.
@Soom Da hast du recht, ich werde gehasst von allen die nur schreiben und nicht lesen können.
-
cooky451 schrieb:
Schließ den Thread doch einfach, die Frage ist seit dem ersten Beitrag geklärt.
Und er hat es immernoch nicht kapiert: dein typedef-Hinweis hat an der Warnung genau NICHTS geändert. Wenn du wirklich was dazulernen willst, dann lies dir hustbaers Beitrag durch, der war fachlich fundiert und hat eine brauchbare Lösung gezeigt.
Jetzt geht dein Blutdruck wahrscheinlich wieder ganz rapide in die Höhe weil du nicht recht gehabt hast und jemand anders was zum Problem hat beisteuern können...