typename in template funktion



  • Hi ich hab ne Frage zu typename. Folgendes:
    So kompilierts:

    template <typename T, typename pred>
    void vector_print_if(vector<T>& vec,pred predicate){
      for (typename vector<T>::iterator i=vec.begin();i<=vec.end();++i){
        if(predicate(*i)) cout<<(*i)<<endl;
      }
    }
    

    So nicht:

    template <typename T, typename pred>
    void vector_print_if(vector<T>& vec,pred predicate){
      for (vector<T>::iterator i=vec.begin();i<=vec.end();++i){
        if(predicate(*i)) cout<<(*i)<<endl;
      }
    }
    

    Die Frage die sich mir hier stellt, ist, wieso muss ich hier typename einfuegen?
    Was macht typename da?

    MFG
    chewbo



  • Wenn du einen Typ verwendest, der von einem Templateparameter abhaengig ist brauchst du typename. Der Compiler weiss ja nicht was sich hinter vector<T>::iterator verbirgt, dass es ein Typ ist musst du ihm so sagen.



  • chewbo schrieb:

    Die Frage die sich mir hier stellt, ist, wieso muss ich hier typename einfuegen?
    Was macht typename da?

    Forensuche? Google?

    template <>
    class vector<int>
    {
    public:
      int iterator;
    };
    


  • Danke fuer die schnelle Antwort Thomas. Macht sinn *lol*

    Und wenn ich ne Antowrt auf meine Frage gefunden hätte hätt ich nicht gefragt @finix.

    Geht schneller zu suchen als zu posten IMHO. Aber will hier kein Streit heraufbeschwören. Musst mir also jetzt nicht noch extra links angeben wo du ne Antwort auf meine Frage gefunden hast.

    MFG
    chewbo



  • Randfrage: Warum nimmst du nicht die vorhandenen Algorithmen der STL, statt dir etwas eigenes zu bauen? Was du da gebastelt hast, ist nichts anderes als remove_copy_if(vec.begin(),vec.end(),ostream_iterator<T>(cout,'\n'),not1(pred));


Log in to reply