Fehlerhafter Aufruf einer Funktion mit Standardparametern



  • Also , ich habe die Funktion foo:

    template<class Iter,class Const_iter,class Ftor>
    void foo(Iter begin,Const_iter end,Ftor f=std::less<typename std::iterator_traits<Iter>::value_type>());
    

    Allerdings scheitert ein Aufruf:

    foo(vec.begin(),vec.end());
    

    Vec ist ein Vector von ints. Fehler:

    Fehler: keine passende Funktion für Aufruf von »foo(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >)«
    
    foo(vec.begin(),vec.end(),std::less<int>());
    

    klappt. Aber wie müsste foo dann aussehen?



  • Hallo,
    ein Standardparameter wird nie für die Herleitung eines Template-Parameters verwendet.



  • Gibt es eine möglichkeit, dass Trotzdem zu bewerkstelligen?

    template<class Iter,class Const_iter,class Ftor=std::less<typename std::iterator_traits<Iter>::value_type> >
    void foo(Iter begin,Const_iter end,Ftor f=std::less<typename std::iterator_traits<Iter>::value_type>());
    

    klappt net...

    template<class Iter,class Const_iter,class Ftor=std::less<typename std::iterator_traits<Iter>::value_type> >
    void foo(Iter begin,Const_iter end,Ftor f=Ftor());
    

    auch net...



  • ness schrieb:

    Gibt es eine möglichkeit, dass Trotzdem zu bewerkstelligen?

    Ja. Nennt sich Überladung:

    // generelle Version
    template<class Iter,class Const_iter,class Ftor>
    void foo(Iter begin,Const_iter end,Ftor f); 
    
    // Überladung
    template<class Iter,class Const_iter>
    void foo(Iter begin,Const_iter end)
    {
        foo(begin, end, std::less<...>());
    
    }
    

    Btw: Default-Argumente für Template-Parameter (die in der Template-Parameterliste) sind bei Funktionstemplates nicht erlaubt.



  • Hm, die lösung ist so logisch, dass ich sie übersehen hab. Danke!


Anmelden zum Antworten