Template-Funktion in Namespace als Template Parameter für Klasse



  • Hallo zusammen,

    ich habe folgendes Problem. Ich übergebe eine Template-Funktion an eine Klasse
    als Template-Parameter. Das funktioniert auch, allerdings nur solange
    die Funktion nicht in einem Namespace ist.

    namespace ns{
    template<typename T>
    T funcNS(const T& i){
            return i;
    }
    }
    
    template<typename T>
    T func(const T& i){
            return i;
    }
    
    template<class T, T (*T2)(const T&)>
    class Foo{
    public:
            Foo(const T& t) : t(t){
            }
    
            void bar(){
                    this->t = T2(t);
            }
    
    private:
            T t;
    };
    
    int main(int argc, char**) {
            Foo<int, &func<int> > foo(0);
            foo.bar();
            Foo<int, &ns:funcNS<int> > foo2(0); // <-- Hier meckert der Compiler
            foo2.bar();
    }
    
    test.cpp: In function 'int main(int, char**)':
    test.cpp:31:43: error: template argument 2 is invalid
    test.cpp:31:49: error: invalid type in declaration before '(' token
    test.cpp:32:14: error: request for member 'bar' in 'foo2', which is of non-class type 'int'
    

    Es funktioniert mit

    using namespace ns;
    

    Allerdings hätte ich gerne eine nicht-using-Lösung.
    Wahrscheinlich ist die Lösung einfach. Ich komme nur gerade nicht drauf...

    Gruß,
    XSpille



  • ::



  • Foo<int, &ns::func<int> > foo(0);
    


  • Danke euch beiden!
    Da war ich heute morgen wohl noch nicht richtig wach und habe mein
    Problem falsch runterreduziert.

    Man sollte nicht versuchen den Zeiger auf die Funktion erst in eine const-Variable
    zu packen 🤡


Anmelden zum Antworten