Undefined Reference bei Funktionen im Namespace



  • Hallo,
    ich habe ein Projekt welches ich in C++ schreibe (da ich sonst in Delphi/Pascal programmiere) und bis jetzt habe ich alles soweit zum Laufen bekommen. Jetzt habe ich aber ein Problem, bei dem ich auch nach längerer Suche keine Lösung finde. Ich habe 2 Funktionen, welche Permissions prüfen sollen. Diese wollte ich in einem eigenen Namespace "PermissionChecks" ansprechen, da sie nicht direkt zum Permission System gehören.

    //permissionChecks.h
    #ifndef PERMISSIONCHECKS_H
    #define PERMISSIONCHECKS_H
    //includes ...
    
    namespace PermissionChecks {
      template<class T> Permission* canAccept(Handle<Value> val, string trace);
      //weitere Funktionen...
    }
    
    #endif
    
    //permissionChecks.cpp
    
    //andere includes ...
    #include "permissionChecks.h"
    
    namespace PermissionChecks {
      template<class T> Permission* canAccept(Handle<Value> val, string trace) {
        //code ...
      }
      //weitere Funktionen...
    }
    

    Mein Problem ist, dass wenn ich jetzt die Header-File "PermissionChecks.h" include, Ich bei Aufrufen der Funktionen aus dem Namespace immer einen Fehler "undefined reference to Permission* PermissionChecks::canAccept..." bekomme. Ich habe mir schon mehrere Threads angeschaut und konnte keinen Fehler finden. Wenn ihr Ideen habt was in meinem Code fehlt würde ich mich freuen wenn ihr es mir erklären könntet.

    Grüße MoritzW



  • Hallo,

    Schau doch mal in die FAQ.
    http://www.c-plusplus.net/forum/246875



  • Templates musst du komplett in den Header schreiben, eine Trennung von Definition und Deklaration ist nicht möglich.

    edit: Mist, fünf Sekunden zu langsam.



  • Definiere die Funktion in der cpp-Datei so:

    template<class T> Permission* PermissionChecks::canAccept<T>(Handle<Value> val, string trace)
    { 
        //Code
    }
    

    Je nach dem was Permission , Handle und Value sind, musst du bei denen auch noch den Namensbereich auflösen.

    PS: Wieso steht da string und nicht std::string ? Willst du dem Nutzer deines Headers nicht selbst überlassen, ob er den Namensbereich std globalisieren möchte?



  • Vielen Dank für die schnelle Hilfe 🙂 ,
    ich hatte schonmal die Funktionen in der Header Datei, das ließ sich aber auch (wahrscheinlich durch einen anderen Fehler) nicht kompilieren. Ich hatte nicht daran gedacht, das die Funktions-Templates komplett im Header liegen müssen.

    @MarcoYolo : Das mit den std::string ist eine gute Idee die ich gleich noch einbaue. Ich bin wie gesagt in ziemlich neu in C++ und muss die "Code-Standarts" noch lernen.



  • ...



  • Swordfish schrieb:

    MoritzW schrieb:

    [...] "Code-Standarts" [...]

    Wortzensur p0wned! 👍 😃

    Solange jeder weis was gemeint ist 😉 (ja ich weis das man das "Standards" und auseinander schreibt)



  • ...



  • MoritzW schrieb:

    Swordfish schrieb:

    MoritzW schrieb:

    [...] "Code-Standarts" [...]

    Wortzensur p0wned! 👍 😃

    Solange jeder weis was gemeint ist 😉 (ja ich weis das man das "Standards" und auseinander schreibt)

    Neeeeeiiin! Nicht auseinander!



  • Ich hör jetzt besser auf bevor das noch schlimmer wird 🙄 . Naja den Fehler werde ich sicher nicht nochmal machen 😃


Anmelden zum Antworten