"non-aggregate type foo()()" ????



  • Guten Morgen zusammen,

    ich hoffe ihr habt die Feiertage alle gut überstanden und freut Euch schon
    aufs nächste Fest 🙂

    Würde ich auch gerne tun, hätte ich nicht ein (vermutlich) ganz dummes
    Problem mit meinem Compiler (Der Drecksack *g*):

    Wieso führt:

    #include "Log.h"
    //...
    Log g_Log;
    //...
    g_Log.foo();
    //...
    

    Zu folgender Fehlermeldung?
    request for member `foo' in `g_Log()', which is of non-aggregate type `Log*()()'??

    Und was sollte mir das überhaupt sagen???

    Gruß,
    Khadgar





  • Du darfst foo() nicht außerhalb von Funktionen aufrufen. Wann soll der Compiler diesen Befehl ausführen?



  • Es tut mir leid wenn ich mich Heute Morgen zu kurz gefasst habe.
    Ich werde hier statt des Beispiels mal die ensprechend relevanten Code-Stellen
    posten und hoffe einer von Euch da draussen sieht dadurch was mir verborgen
    bleibt 🙂

    SDLManager.h

    #include "sdl.h"
    #include "SDL_mixer.h"
    #include "debug/Log.h"
    
    class SDLManager
    {
    public:
      SDLManager();
      ~SDLManager();
    
      bool setupSubsystems(Log &log);
      SDL_Surface* setupVideo(Log &log, int width, int height, int depth, bool fullscreen);
      bool setupAudio(Log &log);
      void setupWindow(const char* path, const char* title, const char* icon);
    
      void drawImage(SDL_Surface *img, SDL_Surface *screen, int x, int y);
      void drawImage(SDL_Surface *img, SDL_Surface *screen, int x, int y, int w, int h, int x2, int y2);
    
      char m_cError[255];
    };
    

    SDLManager.cpp

    #include "SDLManager.h"
    
    SDLManager::SDLManager()
    {
    }
    
    SDLManager::~SDLManager()
    {
    }
    
    bool SDLManager::setupSubsystems(Log &log)
    {
      if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_TIMER) < 0) 
      {
        sprintf(m_cError, "Couldn't initialize SDL subsystems: %s", SDL_GetError());
        log.writeString(m_cError);
        return false; 
      }
      return true;
    }
    
    SDL_Surface* SDLManager::setupVideo(Log &log, int width, int height, int depth, bool isFullscreen)
    {
      SDL_Surface *screen;
      if (isFullscreen) 
      {
        screen = SDL_SetVideoMode(width, height, depth, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN); 
      }
      else  
      {
        screen = SDL_SetVideoMode(width, height, depth, SDL_HWSURFACE | SDL_DOUBLEBUF);
      }
    
      if (screen == NULL) 
      {
        sprintf(m_cError, "Couldn't setup video %d x &d x %d: %s", width, height, depth, SDL_GetError());
        return NULL;
      }
      return screen;
    }
    
    bool SDLManager::setupAudio(Log &log)
    {
      if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 2048) < 0) 
      {
        sprintf(m_cError, "Couldn't setup audio: %s", SDL_GetError());
        return false;
      }
      return true;
    }
    
    void SDLManager::setupWindow(const char* path, const char* title, const char* icon)
    {
      SDL_WM_SetIcon(SDL_LoadBMP(path), NULL);
      SDL_WM_SetCaption(title, icon);
    }
    
    void SDLManager::drawImage(SDL_Surface *img, SDL_Surface *screen, int x, int y)
    {
      SDL_Rect dest;
      dest.x = x;
      dest.y = y;
      SDL_BlitSurface(img, NULL, screen, &dest);
    }
    
    void SDLManager::drawImage(SDL_Surface *img, SDL_Surface *screen, int x, int y, int w, int h, int x2, int y2)
    {
      SDL_Rect dest;
      dest.x = x;
      dest.y = y;
      SDL_Rect dest2;
      dest2.x = x2;
      dest2.y = y2;
      dest2.w = w;
      dest2.h = h;
      SDL_BlitSurface(img, &dest2, screen, &dest);
    }
    

    Ausschnitt aus der main-Methode

    #include "debug/Log.h"
    //...
    Log g_Log("Projekt28Log.txt");
    SDLManager g_SDLManager();
    //...
    int main(int argc, char *argv[])
    {
      if (! g_SDLManager.setupSubsystems(g_Log)) return 0;
      if (( g_pScreen = g_SDLManager.setupVideo(g_Log, g_iScreenWidth, g_iScreenHeight, 16, false)) == NULL) return 0;
      if (! g_SDLManager.setupAudio(g_Log)) return 0;
    //...
    

    Und zu guter Letzt: Das Kompiler-Log
    *
    Compiler: Default compiler
    Building Makefile: "C:\Dokumente und Einstellungen\Andreas\Eigene Dateien\C++\Projekt28\Makefile.win"
    Führt make... aus
    make.exe -f "C:\Dokumente und Einstellungen\Andreas\Eigene Dateien\C++\Projekt28\Makefile.win" all
    g++.exe -c main.cpp -o main.o -I"C:/Programme/Dev-Cpp/include/c++" -I"C:/Programme/Dev-Cpp/include/c++/mingw32" -I"C:/Programme/Dev-Cpp/include/c++/backward" -I"C:/Programme/Dev-Cpp/include" -I"C:/Programme/Dev-Cpp/include/SDL"

    main.cpp: In function int SDL_main(int, char**)': main.cpp:64: request for member \setupSubsystems' in `g_SDLManager()', which is
    of non-aggregate type SDLManager ()()' main.cpp:65: request for member \setupVideo' in `g_SDLManager()', which is of
    non-aggregate type SDLManager ()()' main.cpp:66: request for member \setupAudio' in `g_SDLManager()', which is of
    non-aggregate type SDLManager ()()' main.cpp:71: request for member \setupWindow' in `g_SDLManager()', which is of
    non-aggregate type `SDLManager ()()'

    make.exe: *** [main.o] Error 1
    Ausführung beendet*

    Wahrscheinlich ist das irgendein ganz trivialer Fehler und ich blicks einfach
    nicht 😞 Könnt Ihr mir helfen?

    Danke im Voraus,
    Khadgar



  • SDLManager g_SDLManager();

    vergleiche das mal mit folgendem, äquivalentem konstrukt

    int funktion();

    kommt dir da etwas komisch vor?



  • Dank dir Shade Of Mine!
    Irgendwie musste es ja sowas absolut dummes sein 😞
    Vielen Dank auch dir doreen, nach dem Hinweis von Shade verstehe ich jetzt
    auch den geposteten Link 🙂 Ich werds nochmal durcharbeiten.


Anmelden zum Antworten