Problem mit Printfunktion <template>



  • Hallo!
    Ich hab eine generische Printfunktion mit Iteratoren als Parameter geschrieben, allerdings funktioniert es aus irgendeinem Grund (Debugausgabe versteh ich nicht):

    template<typename TItor>
    void Print(TItor first, TItor last, string const& str, ostream& stream=cout)
    {
    	stream << endl << str << endl;
    
    	copy(first, last, ostream_iterator <iterator_traits<TItor>::value_type>(stream, " "));
    
    }
    

    Der Prototyp sieht im Header-File folgendermaßen aus:

    template<typename TItor>
    void Print(TItor first, TItor last, string const& str, ostream& stream);
    

    Der Aufruf in der main Funktion sieht folgendermaßen aus:

    Print(liste.begin(),liste.end(),"unsorted values",cout);
    

    include iterator, iostream wurde schon eingebunden

    Vllt versteht ihr was gemeint wird:

    Error	1	error LNK2019: unresolved external symbol "void __cdecl
     Print<class std::_List_iterator<class std::_List_val<class Element,class
     std::allocator<class Element> > > >(class std::_List_iterator<class std::_List_val<class Element,class std::allocator<class Element> > >,class 
    std::_List_iterator<class std::_List_val<class Element,class 
    std::allocator<class Element> > >,class std::basic_string<char,struct 
    std::char_traits<char>,class std::allocator<char> > const &,class 
    std::basic_ostream<char,struct std::char_traits<char> > &)" 
    (??$Print@V?$_List_iterator@V?$_List_val@VElement@@V?$allocator@VElement@@@std@@
    @std@@@std@@@@YAXV?$_List_iterator@V?$_List_val@VElement@@V?$allocator@VElement@
    @@std@@@std@@@std@@0ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1
    @AAV?$basic_ostream@DU?$char_traits@D@std@@@1@@Z) referenced in function _main
    	D:\Pfad\main.obj
    

    mfg
    ACnut



  • Hast du möglicherweise die Implementation ins cpp-File gesteckt? Templates müssen vollständig im Header definiert sein http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl.html.

    Ausserdem nie using namespace std; im Header schreiben ("using namespace std header" ist googlebar).



  • ...


  • Mod

    copy(first, last, ostream_iterator <typename iterator_traits<TItor>::value_type>(stream, " "));
    


  • Swordfish schrieb:

    [cpp]#include <list>
    #include <string>
    #include <iostream>

    using namespace std;

    template<typename TItor>
    void Print(TItor first, TItor last, string const& str, ostream& stream=cout)
    {
    stream << endl << str << endl;

    copy(first, last, ostream_iterator <iterator_traits<TItor>::value_type>(stream, " "));

    }

    Was sollen die endl s?

    bingo template funktion muss komplett im header stehen. zwar musste ich jetzt den ausgabeoperator überladen aber jetzt geht es wenigstens 🙂 vielen dank
    das mit dem namespace muss ich noch ändern danke

    weil die ausgabe so sein muss 😃 :

    unsorted values:
    
    6-0 10-1 9-2 0-3 7-4 10-5 7-6 7-7 1-8 5-9 5-10 7-11 6-12 7-13 0-14
    8-15 8-16 9-1 7 1-18 9-19 9-20 9-21 0-22 10-23 7-24 8-25 6-26 2-27
    7-28 7-29 6-30 1-31 8-32 2-33 4-34 4-35 1-36 6-37 1-38 8-39
    
    ascend stable sorted values:
    
    0-3 0-14 0-22 1-8 1-18 1-31 1-36 1-38 2-27 2-33 4-34 4-35 5-9 5-10
    6-0 6-12 6-26 6-30 6-37 7-4 7-6 7-7 7-11 7-13 7-24 7-28 7-29 8-15
    8-16 8-25 8-32 8-39 9-2 9-1 7 9-19 9-20 9-21 10-1 10-5 10-23
    
    ascend sorted values:
    
    0-3 0-14 0-22 1-8 1-18 1-31 1-36 1-38 2-27 2-33 4-34 4-35 5-9 5-10
    6-0 6-26 6-12 6-30 6-37 7-28 7-4 7-6 7-7 7-11 7-13 7-24 7-29 8-15
    8-16 8-39 8-32 8-25 9-21 9-2 9-19 9-17 9-20 10-5 10-1 10-23
    


  • ...



  • camper hat Recht. Da muss [temp.res]/2 berücksichtigt werden.

    Swordfish schrieb:

    @camper: 😮

    Jo, aber des wars net.

    Die Fehlermeldung ist eine ganz gewöhnliche Linker-Beschwerde darüber, dass keine Definition für eine Funktion gefunden wurde.
    (Nur so lang, da die komplette template-id + der gemangelte Name hingeschrieben wurde).

    Wäre da ein typename zu wenig, wäre die Fehlermeldung doch direkter?



  • @camper wieso kann ma den typename auch innerhalb der stl-algo haben? was bewirkt das

    \n haben wir soweit ich weiß nie benutzt, daher ist es bei uns endl zur gewohnheit gerworden 😃



  • ACnut schrieb:

    @camper wieso kann ma den typename auch innerhalb der stl-algo haben? was bewirkt das

    Ist der Name nicht selbsterklärend? Das sagt, dass es sich bei nachfolgendem um einen Typen handelt, und nicht um einen Wert.

    ACnut schrieb:

    \n haben wir soweit ich weiß nie benutzt, daher ist es bei uns endl zur gewohnheit gerworden 😃

    Shit happens. Gewöhn es dir ab und sag es auch deinen Kommilitonen. 🙂



  • ...



  • ja ich werds mit \n versuchen 😉



  • ACnut schrieb:

    ja ich werds mit \n versuchen 😉

    und wenn dir \ oder ' zu blöd zum tippen ist, dann schreib dir einen Manipulator:

    ostream& newl( ostream& out )
    {
        out << '\n';
    }
    


  • out schrieb:

    ACnut schrieb:

    ja ich werds mit \n versuchen 😉

    und wenn dir \ oder ' zu blöd zum tippen ist, dann schreib dir einen Manipulator:

    ostream& newl( ostream& out )
    {
        out << '\n';
    }
    

    Ist das dein Ernst?



  • Sone schrieb:

    out schrieb:

    ACnut schrieb:

    ja ich werds mit \n versuchen 😉

    und wenn dir \ oder ' zu blöd zum tippen ist, dann schreib dir einen Manipulator:

    ostream& newl( ostream& out )
    {
        out << '\n';
    }
    

    Ist das dein Ernst?

    Ja. Manche nehmen extra amerikanische Tastatur weil es ihnen zu blöd ist.


  • Mod

    const char nl = '\n' ?

    out schrieb:

    Manche nehmen extra amerikanische Tastatur weil es ihnen zu blöd ist.

    Das ist natürlich die "richtige" Lösung, weil man dann die Sprache benutzt, wie sie gedacht ist.



  • SeppJ schrieb:

    const char nl = '\n' ?

    Hmm, zu kompliziert gedacht. Touche 🙂

    SeppJ schrieb:

    out schrieb:

    Manche nehmen extra amerikanische Tastatur weil es ihnen zu blöd ist.

    Das ist natürlich die "richtige" Lösung, weil man dann die Sprache benutzt, wie sie gedacht ist.

    Jup.



  • out schrieb:

    Sone schrieb:

    out schrieb:

    ACnut schrieb:

    ja ich werds mit \n versuchen 😉

    und wenn dir \ oder ' zu blöd zum tippen ist, dann schreib dir einen Manipulator:

    ostream& newl( ostream& out )
    {
        out << '\n';
    }
    

    Ist das dein Ernst?

    Ja. Manche nehmen extra amerikanische Tastatur weil es ihnen zu blöd ist.

    Nein, ich meinte, genau wegen dem was SeppJ meinte, du kannst auch einfach eine Konstante nehmen. 🙂



  • Sone schrieb:

    Nein, ich meinte, genau wegen dem was SeppJ meinte, du kannst auch einfach eine Konstante nehmen. 🙂

    Ja, hast Recht. 😃 *kopf meets tischkante*



  • ...



  • Swordfish schrieb:

    out schrieb:

    SeppJ schrieb:

    out schrieb:

    Manche nehmen extra amerikanische Tastatur weil es ihnen zu blöd ist.

    Das ist natürlich die "richtige" Lösung, weil man dann die Sprache benutzt, wie sie gedacht ist.

    Jup.

    mhm. Meine Finger wissen sehr genau, wo benötigte Tasten(-kombinationen) sind. Auch auf Tastaturen mit deutschem Layout ... alles Gewohnheitssache.

    Isso! Dank CodeBlocks drücke ich eh nur drei Tasten, und die sind mir im Blut 😃 '\n '\n '\n


Anmelden zum Antworten