Problem mit typedef struct {..} name; und class forwarding



  • Folgende Fehlermeldung VS2012:

    `error C2371: 'tFrame' : redefinition; different basic types

    api_user.h(4) : see declaration of 'tFrame'`

    Was probiere ich:

    In Api_User.h definiere ich eine Klasse test die einen Pointer tFrame verwaltet. Um die Abhaengigkeiten gering zu halten, deklariere ich die Klasse tFrame im voraus. Hintergrund: Nur diejenigen, die wirklich was mit tFrame machen moechten, muessen den entsprechenden Header inkludieren.

    #ifndef API_USER_H
    #define API_USER_H
    
    struct tFrame;
    
    class test
    {
        tFrame* ptr_;
    };
    #endif
    

    Ungluecklicherweise ist tFrame als Datenelement einer externen C-Api in Api.h mittels typedef wie folgt deklariert:

    #ifndef API_H
    #define API_H
    
    typedef struct
    {
    } tFrame;
    #endif
    

    Will ich nun beide benutzen, wirft der Kompiler obige Fehlermeldung.

    #include "Api_User.h"
    #include "Api.h"
    
    int main()
    {
    	return 0;
    }
    

    Wie sieht eine richtige forward Deklaration in diesem Fall ( typedef struct {..} name; ) aus?



  • struct mytFrame;
    typedef mytFrame tFrame;
    

    Edit: vergisses...



  • Geht nicht. Was Du da hast, ist ein typedef auf ein anonymes struct. Typedefs kannst Du nicht vorwärts deklarieren. Du brauchst eine nicht anonyme struct.



  • Du müsstest hier wohl void* oder einen typsicheren Wrapper darum herum benutzen.

    Kommt tFrame in Api_User.h sonst noch vor?



  • Als Workaround könntest Du vielleicht auch von dem Typedef ableiten, und dann den dabei entstehenden Typen benutzen. Ich bin mir aber gerade nicht sicher, ob das Verhalten noch definiert ist, wenn Du Objekte vom abgeleiteten Typen in das C-API gibst...



  • Ich dachte mir schon, das es nicht geht, leider. Ableiten moechte ich nicht. Die aktuelle alternative ist void* und dabei wird es wohl oder uebel bleiben. Danke fuer die Vorschlage.


Anmelden zum Antworten