Ausgelagerte #ifdefs und Templates



  • also erstmal danke für die antworten.

    Ja ich hab da versucht ein minimalbeispiel auf die schnell aus dem kopf zu posten weil ich etwas mehr code hab. Die Anführungszeichen fehlen da ja. Und das template <class T> hab ichvergessen sorry.

    Ich bemerke dass mein Code wo anders das Problem hat und zwar bei sowas:

    template<class T> CL<T>::CL(int a)
    {
       bar(a);
    }
    

    wobei bar() in einem der variante1/xyz1.hpp definiert sind

    bar(int a)
    {
       //do something...
    }
    


  • gruppa schrieb:

    Ja ich hab da versucht ein minimalbeispiel auf die schnell aus dem kopf zu posten weil ich etwas mehr code hab.

    Häufig bringt der Versuch, das Minimalbeispiel zu compilieren schon den Aha-Effekt. Das erspart dir dann die Wartezeit bis jemand antwortet und uns ersparts das Nachbessern deiner Tippfehler wenn wir versuchen deinen Fehler nachzustellen.



  • hmm ja ok. Was kann man denn machen wenn man in einer template funktion eine funktion aufruft die eben nicht template-abhängige paramter hat sondern komplett tamplate frei ist?



  • gruppa schrieb:

    Was kann man denn machen wenn man in einer template funktion eine funktion aufruft die eben nicht template-abhängige paramter hat sondern komplett tamplate frei ist?

    Diese aufrufen? 😕

    Wo liegt dein Problem genau? Du musst halt Funktionen vor ihrem Aufruf deklarieren.



  • mein problem liegt genau hierin:

    template <class T>
    Foo<T>::Foo(int a)
    {
       bar(a);
    }
    

    und bar() steht so in einem der variante* header:

    inline void bar(int a) {
       //do something
    }
    

    und die meldung ist eben:

    error: there are no arguments to 'bar’ that depend on a template parameter, so a declaration of ‘bar’ must be available
    

    aber wie soll ich dann template-freie funktionen in einer template-funktion aufrufen oder hängt das mit den ausgelagerten ifdefs zusammen?

    Danke



  • Ist bar() zu der Zeit des Aufrufs bekannt, sprich wurde die Funktion deklariert?


  • Administrator

    gruppa schrieb:

    ... oder hängt das mit den ausgelagerten ifdefs zusammen?

    Wenn der Kompiler kompiliert, hat der Präprozessor bereits gewütet. Also ist es eher unwahrscheinlich, dass es etwas direkt mit dem ifdef zu tun hat. Ausser du hast die MAKROs falsch gesetzt, wodurch die Deklaration nie eingebunden wurde. Da hilft es manchmal den Output des Präprozessors anzuschauen.

    Ansonsten probier mal den Aufruf von bar genau zu spezifizieren. Also die genaue Angabe zu setzen, in welchem Namensraus sich bar befindet.

    Grüssli



  • da hilft es manchmal den Output des Präprozessors anzuschauen.

    wie kann ich das tun?



  • Wird bar() in beiden Varianten genutzt oder nur in einer. Ist es denn in beiden Varianten deklariert?



  • gruppa schrieb:

    da hilft es manchmal den Output des Präprozessors anzuschauen.

    wie kann ich das tun?

    hängt von deinem Compiler ab. Den meisten Compilern kann man einen Kommandozeilenparameter mitgeben der dafür sorgt, dass nur der Präprozessordurchlauf erfolgt und der entsprechende Output ausgegeben wird.

    => Konsutliere die Doku/Hilfe/man-Pages deines Compilers



  • Wird bar() in beiden Varianten genutzt oder nur in einer. Ist es denn in beiden Varianten deklariert?

    Ja - bar() wird in beiden varianten definiert und deklariert.



  • und bar() sollte zu der zeit bekannt sein weil im header wo ich ich den konstruktor habe wird oben ein weiterer header eingebunden in dem dann je nach flag variante1 oder variante2 eingebunden wird. Somit sollte bar() verfügbar sein....



  • hmm...ich hab nen link gefunden worin über this->bar() das ding zum funzen kommt....wäre das valide bzw. ich versuche noch zu verstehen warum es so geht....



  • Ich habe ein weiteres problem und das passt hierhin deswegen möchte ich nicht unbedingt einen neuen thread aufmachen:

    Ich bekomme seltsamerweise ein "VEC" has not been declared wenn ich in den variante*.hpp headern einen typ "VEC" in der signatur verwende. Und das obwohl ich die klasse bzw. den header einbinde vorher!

    also sowas:

    //variante1.hpp
    
    template <class T> inline void bar(VEC<T>* v)
    {
    
    }
    

    bar() benutze ich dann z.B. im Konstuktor von Foo wie oben im code dargestellt - natürlich mit richtigem VEC Parameter als übergabe.

    Nur warum bekommei ch ein has not been declared obwohl ich VEC einbinde als Klasse? Woran könnte das liegen?



  • *push



  • was sagt dir denn die fehlermeldung?

    evtl steht da ja was von typename?
    scho ma damit rumprobiert? gibt ja nu nich so viele stellen, wo man das hinsetzen könnte, wo es sinn macht - und es steht so gar in der fehlermeldung und sollte eigtl auch genug themen dazu hier und vor allem bei www.google.de geben ^^

    bb


Anmelden zum Antworten