Problem mit class type_info und typeid



  • 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.


Anmelden zum Antworten