Problem mit class type_info und typeid



  • Habe leider ein kleines Problem mit der class type_info.

    Ich benutze 2 unterschiedliche Compiler um meine Lib zu kompilieren, zum einen den gcc3.4.4 und zum anderen den ghs4.2.2
    Mit dem gcc habe ich standardmäßig keine Probleme.
    Wenn ich allerdings den ghs verwende bekomme ich folgende Fehlermeldung:

    .../include/STL/typeinfo", line 90: error #772: declaration conflicts with "std::type_info" (reserved class name)
    class type_info

    Der Compiler lässt nicht zu, dass ich die Klasse type_info in meiner Lib im std-Namespace habe.
    Nun habe ich rumprobiert.
    1. Ich habe den Namespace in meiner <typeinfo> von

    namespace std {
    

    in

    namespace my_std {
    

    umbenannt.
    Jetzt kommt typeid hinzu. Ich bekomme nun folgende Fehler:

    no suitable user-defined conversion from "const type_info" to "const my_std::type_info" exists

    und

    <typeinfo> must be included before typeid is used

    Kann es sein, dass durch die Benutzung von "typeid" nach einem File <typeinfo> gesucht wird, in welchem die Klasse type_info im std Namespace steht?

    2. Ich habe die Klasse type_info weder im std noch in einem anderen Namespace definiert.
    Jetzt verbleibt lediglich die der Fehler:

    <typeinfo> must be included before typeid is used

    3. Mein letzer Versuch war die Klasse

    class type_info
    

    in

    class my_type_info
    

    umzubenennen.
    Jetzt verbleibt lediglich der Fehler:

    no suitable user-defined conversion from "const type_info" to "const my_type_info" exists

    Momentan bin ich ratlos und weiß nicht weiter, da der gcc einwandfrei durchläuft 😕

    Danke euch für jeden Hinweis den ich bekomme, selbst für Tadel und Kritik, falls ich mich wie ein Anfänger(was ich bin) benehme



  • Der Compiler lässt nicht zu, dass ich die Klasse type_info in meiner Lib im std-Namespace habe.

    Das muss er auch nicht, da der Namespace std nur vom Bibliothekshersteller gefüllt werden darf. Verstehe ich das richtig, dass Du versuchst eine eigene STL mit dem Compiler zu verwenden und nicht die, die beim ghs dabei ist?



  • So ungefähr, ja.
    Wenn ich jetzt also das Problem lösen will und meine eigene type_info klasse möchte, welche identisch zu der standardmäßigen ist, aber ich nicht die vom compiler benutzen möchte, kann ich das dann irgendwie bewerkstelligen?



  • MMlo schrieb:

    Wenn ich jetzt also das Problem lösen will und meine eigene type_info klasse möchte, welche identisch zu der standardmäßigen ist,

    Wenn deine typeinfo identisch zur Standard-Version ist, warum benutzt du dann nicht einfach letztere? Normalerweise sind die mitgelieferten Header der Compiler schon optimal auf deren Eigenheiten abgestimmt.



  • Es ist so, ich habe eine Lib gekauft in welcher die Datei typeinfo mit der klasse type_info im namespace std steht. Nun möchte ich diese Lib compilieren, mit dem gcc funktioniert dass auch einwandfrei, nur der ghs beschwert sich dass type_info im namespace std ein reservierter klassenname ist. Mein Ziel ist es später nur die Header und Dateien der gekauften Lib zu verwenden und nicht die vom Compiler mitgelieferten, dass müsste doch möglich sein oder nicht?

    Vielen Dank für die bisherigen Antworten:)



  • Es ist auch dringend zu empfehlen nicht die Greenhhills stl zu benutzen.
    Die ist leider nicht zu gebrauchen.



  • Ich möchte ja auch nicht die STL von ghs benutzen.
    Mein Ziel ist es ja zu erreichen, dass später nur Quelldateien und Header aus meiner gekauften Lib benutzt werden, und das Problem liegt beim ghs.

    Es ist doch unlogisch, dass mir der ghs eine Fehlermeldung spuckt, dass type_info ein reservierter Klassenname ist, gleichzeitig typeid voraussetzt dass ich einen header typeinfo habe, in welchem die type_info klasse im namespace std steht.

    Und da ich meineswissens die Implementierung von typeid nicht verändern kann, somit auch nicht in der Lage bin dass Problem mit typeid zu lösen, verbietet mir ja der ghs praktisch andere Libs als seine zu benutzen, oder nicht?
    Es kommt mir so vor als ob der ghs damit sicherstellen will, dass man auf jeden Fall seine Lib-Lizenzen erwerben muss um ein sinnvolles Ergebnis zu erzielen...

    Hatte vielleicht schon jemand ähnliche Probleme?
    Besten Gruß und Danke für die bisherigen Antworten :xmas1:



  • In welcher Datei von GHS ist denn typeid usw. deklariert?
    Habs nicht gefunden.
    Kann es sein, dass das vom compiler einfach nicht unterstützt wird?



  • Die Schlüsselwörter wie if, else etc. kommen ja meineswissens vom Compiler, haut mir ruhig eins auf den Deckel wenn ich falsch liege.
    typeid ist auch so ein Schlüsselwort, welches mir lediglich während der Laufzeit die Klasse eines Objekts zurückliefern soll.

    Den Header typeinfo vom ghs kann Ich mir ja nicht ansehen, dass könnte meiner Meinung nach die Fehlerquelle sein.

    Um das Problem nochmal kurz zusammenzufassen:

    -Ich habe eine gekaufte Lib

    -Diese Lib soll am Ende die einzige sein aus welcher Ich Files benutzen will

    -Die Files vom Compiler möchte Ich nicht benutzen

    -typeid ist ein Schlüsselwort welches beim ghs scheinbar voraussetzt dass Ich einen Header typeinfo mit einer Klasse type_info im namespace std habe

    -Dieser Header MUSS scheinbar vom ghs selbst kommen, da Ich bei einem Header aus der gekauften Lib eine Fehlermeldung: "std::type_info is a reserved class name" bekomme

    n welcher Datei von GHS ist denn typeid usw. deklariert?
    Habs nicht gefunden.
    Kann es sein, dass das vom compiler einfach nicht unterstützt wird?

    Ich denke es wird vom Compiler unterstützt, allerdings nur mit seinem eigenen Headerfile, was Ich aber nicht benutzen will.
    Gibt es also einen Weg den ghs auszutricksen, indem Ich beispielsweise in meinem Header typeinfo aus der gekauften Lib, die Klasse type_info in my_type_info umbenenne und eine Methode/Konstruktor hinzufüge die z.B. die Klasse type_info welche von typeid zurückkommt auf die Klasse my_type_info castet um eine Konvertierungsmöglichkeit zwischen beiden Klassen zu schaffen?

    Danke für dein Engagement templäd



  • Ich möchte mich gleichmal wegen dem Doppelpost entschuldigen.

    Was mir unter umständen helfen könnte, wäre wenn vielleicht jemand weiß wie man diesen Fehler behebt.

    no suitable user-defined conversion from "const type_info" to "const my_type_info" exists

    Gibt es eine Möglichkeit solch eine Konvertierung möglich zu machen?
    Indem Ich z.B. my_type_info auf type_info caste?
    Danke schon jetzt



  • MMlo schrieb:

    Gibt es eine Möglichkeit solch eine Konvertierung möglich zu machen?
    Indem Ich z.B. my_type_info auf type_info caste?
    Danke schon jetzt

    Ja, gibt es - verpasse der Klasse my_type_info einen Konstruktor, der einen type_info entgegennimmt.



  • protected:	// to shut up compiler
    	type_info(const type_info&);	// not defined
    

    Habe diesen Abschnitt in der type_info Klasse gefunden. Ist das Möglicherweise schon meine Problemlösung?

    CStoll schrieb:

    Ja, gibt es - verpasse der Klasse my_type_info einen Konstruktor, der einen type_info entgegennimmt.

    Danke CStoll, Ich werde es gleich mal so probieren.



  • Also, Ich wollte es so versuchen, hab allerdings schnell feststellen müssen, dass es so nicht klappt.

    Der Compiler will folgendes:
    Man darf im namespace std keine Klasse mit Namen "type_info" anlegen.

    Typeid will folgendes:
    Man muss den Header "typeinfo" mit einer Klasse "type_info" im namespace std inkludieren.

    ->Soll das heißen Ich darf nur den Header "typeinfo" vom Compiler benutzen?

    Typeid liefert mir ja einen Rückgabewert vom Typ "const type_info&". Für den Typ wird er die "typeinfo" benötigen und die darin von ihm erwartete Klasse "type_info". Ist es irgendwie möglich herauszufinden, wie "typeid" nachsieht ob es eine Klasse "type_info" im namespace std gibt, um möglicherweise dort etwas zu verändern, oder kann dass nur der Compilerhersteller der "typeid" praktisch liefert?



  • ->Soll das heißen Ich darf nur den Header "typeinfo" vom Compiler benutzen?

    BINGO!!!
    Was dir auch von Anfang an gesagt wurde (OK, fast zumindest 🙂 ).
    Weiss nicht was jetzt so schwer ist, und warum du dich so querstellst. Das was typeid() zurückgibt ist eine "type_info", und das spuckt der Compiler aus. Die Definition von type_info MUSS daher zum Compiler passen, und daher solltest du auch einfach die Header verwenden die mit dem Compiler mitgekommen ist.



  • erstmal danke dass sich überhaupt noch wer mit mir befasst:)

    ich bin jetzt so vorgegangen wie es mir am anfang schon gesagt wurde, und habe den header aus der lib mit dem vom compiler ersetzt, jetzt kommt allerdings das, womit ich schon gerechnet habe.

    die header unterscheiden sich nur minimal an 2-3 unbedeutenden stellen, die sind wirklich unbedeutend(Kommentare, etc...) und der fehler besteht weiterhin.

    im endeffekt ist es also so, dass der compiler die type_info klasse weder "im bauch" hat, noch den header aus der gekauften lib akzeptiert und auch seinen eigenen mitgelieferten header nicht!?

    da ich in c++ echt nicht der guru bin verstehe ich dass überhaupt nicht.
    irgendwoher muss doch die type_info für typeid kommen oder nicht?



  • Der Compiler hat die type_info Klasse sehrwohl "im Bauch", bloss die für C++ Programme sichtbare Deklaration der type_info Klasse nicht.
    Wenn diese in C++ formulierte Deklaration aber nicht mit der "internen" Variante der Klasse übereinstimmt dann führt das zu Problemen.

    Aber erstmal egal.

    Wo funktioniert genau was bei dir nicht? Fehlermeldung? Was passiert, was sollte passieren?



  • ok, die klasse ist also "im Bauch" vorhanden.
    Die Fehlermeldungen sind im Endeffekt aber die gleichen wie Anfangs schon genannt.
    Der Header typeinfo vom Compiler ist identisch mit dem von der Lib.
    Ich habe schon versucht statt des Lib Headers den vom Compiler einzuziehen, der verursacht aber die gleichen Fehler.

    Der Fehler lautet: declaration conflicts with std::type_info(reserved class name)

    Er sagt mir also bei beiden Headern, dass der Klassenname type_info für den Compiler reserviert ist. Woher also will der Compiler die Deklaration nehmen, wenn er sie in beiden Headern nicht akzeptiert?



  • Vielleicht hat der Compiler ne Spezialbehandlung drinnen dass er den Pfad seines eigenen "typeinfo(.h)" Files erkennt, und nur dort die Definition erlaubt? Würde die Fehlermeldung erklären.

    Was auf jeden Fall funktionieren MUSS ist, wenn du den Compiler normal installierst, nix an der Reihenfolge veränderst in der include-Files gesucht werden, und dann das File "typeinfo(.h)" inkludierst.

    Wenn das erstmal geht ist der Rest ein Klacks, lösch einfach alle Files die "typeinfo.h" heissen bis auf die die mit dem Compiler mitinstalliert wurden.

    Irgendwelche Libraries oder eigener Code haben auf jeden Fall diese Klasse nicht zu definieren. Und müssen das auch nicht, die Funktionalität von typeid und type_info ist im Compiler eingebaut und muss ohne zusätzliche Libraries funktionieren (zusätzlich: alles was nicht mit dem Compiler mit kommt).



  • So liebe Helfer

    Danke für eure Anstrengungen. Nach etwas längerer Zeit habe Ich das Problem nun in den Griff bekommen. Hier die Lösung für alle die es interessiert.

    Der Greenhills-Compiler benutzt das EDG Front End. Das war mir zum damaligen Zeitpunkt leider nicht klar. Im Header typeinfo ist eine Abfrage

    #if __EDG__
     #pragma define_type_info
    #endif
    

    Wenn Ich das Makro setze läuft alles einwandfrei. Allerdings steht in der Doku und den Manuals des GHS kein derartiger Hinweis und das Makro wird auch nicht automatisch gesetzt.
    Lange hats gedauert, aber jetzt hab Ich es raus.
    Danke an alle die versucht haben mir zu helfen.

    Besten Gruß und schönen Tag 👍



  • Freund. Wir haben dir von vornherein gesagt dass du das Original-File des Compiler-Herstellers verwenden sollst (=einfach inkludieren und NICHT in dein Projekt reinkopieren).
    Ich verstehe immer noch nicht warum du damit überhaupt jemals ein Problem hattest.


Log in to reply