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.objmfg
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).
-
...
-
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
endls?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 dankeweil 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:
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
typenamezu 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.
-
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
