Iterator Methode Copy
-
Hallo, habe folgendes Problem:
//Iter.h #include <vector> #include <iterator> #include <iostream> #include <string> using namespace std; template <class IterType> void print(IterType first, IterType last) { cout << "Huzel: | "; while(first != last) { cout << *first++ << " | "; } } template <class IterType, class ValueType> void modify(IterType first, IterType last, ValueType val) { while(first != last) { *first++ = val; } } template <class InIterType, class OutIterType> void copy(InIterType first, InIterType last, OutIterType result) { while(first != last) { *result++ = *first++; } }// IteratorExample.cpp #include <iostream> #include <vector> #include <list> #include "Iter.h" using namespace std; int main() { vector<int> data; data.push_back(1); data.push_back(42); print(data.begin(), data.end()); modify(data.begin(), data.end(), 42); int length = data.size(); list<int> dest(length); copy(data.begin(), data.end(), dest.begin()); return 0; }Bekomme beim Aufruf der Methode copy(...) eine Fehlermeldung und weiss leider nicht diese zu lösen.
"call of overloaded 'copy(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, std::_List_iterator<int>)' is ambiguous"
^^Kann mir da jmd freundlicherweise helfen? Die anderen zwei Methoden funktionieren

Vielen Dank
O51
-
Steht doch da: Deine eigene copy-Mehode beißt sich mit der aus std::.
Also umbenennen oder in einen eigenen namespace packen oder nicht using namespace std;
-
Ich würde eher vorschlagen,
Iter.hzu eliminieren und die Standardbibliothek zu benutzen:
http://www.cplusplus.com/reference/algorithm/copy/
http://www.cplusplus.com/reference/algorithm/fill/
http://www.cplusplus.com/reference/std/iterator/ostream_iterator/Auf der anderen Seite ist es natürlich ein schönes Beispiel für die unachtsame Verwendung von
using namespace std.
Grüssli
-
l'abra d'or_off schrieb:
Steht doch da: Deine eigene copy-Mehode beißt sich mit der aus std::.
Also umbenennen oder in einen eigenen namespace packen oder nicht using namespace std;Vielen Dank für die schnelle Antwort, läuft nun! Habe noch etwas Probleme die Fehlermeldungen zu lesen

-
bla blub schrieb:
l'abra d'or_off schrieb:
Steht doch da: Deine eigene copy-Mehode beißt sich mit der aus std::.
Also umbenennen oder in einen eigenen namespace packen oder nicht using namespace std;Vielen Dank für die schnelle Antwort, läuft nun! Habe noch etwas Probleme die Fehlermeldungen zu lesen

Das ist normal am Anfang.
Kleiner Tipp. Probier zuerst nur mal den richtigen Text zu lesen. Das was da an Code steht ist oftmals sehr lange und nicht von Interesse.
Extrahieren wir das mal an dem Beispiel:call of overloaded 'copy' is ambiguous
Dann weisst du schon mal, dass da ein Konflikt besteht. Und nun kannst du falls dir nicht einfällt welche Methoden das verursachen kannst du den Code probieren anzuschauen. (Unter Visual Studio werden dir die genauen Vorschläge dann auch noch aufgelistet).
Und auch wenn du den Code nicht verstehst/deuten kannst, dann kommst du nicht herum einen anderen Namespace zu wählen und das Problem ist gelöst (sofern du natürlich dann den Namensraum std ausschliest (zumindest implizit))
-
Ganz böse vor allem: "using namespace std;" in der Header-Datei!
-
drakon schrieb:
Das ist normal am Anfang.
Kleiner Tipp. Probier zuerst nur mal den richtigen Text zu lesen. Das was da an Code steht ist oftmals sehr lange und nicht von Interesse.
Extrahieren wir das mal an dem Beispiel:call of overloaded 'copy' is ambiguous
Dann weisst du schon mal, dass da ein Konflikt besteht. Und nun kannst du falls dir nicht einfällt welche Methoden das verursachen kannst du den Code probieren anzuschauen. (Unter Visual Studio werden dir die genauen Vorschläge dann auch noch aufgelistet).
Und auch wenn du den Code nicht verstehst/deuten kannst, dann kommst du nicht herum einen anderen Namespace zu wählen und das Problem ist gelöst (sofern du natürlich dann den Namensraum std ausschliest (zumindest implizit))Hab den Code auf die beschriebene Art auch versucht zu deuten, bin aber nicht drauf gekommen, das copy im namespace std schon vorhanden ist

Programmiere eben sehr selten und mit Eclipse (ja, ich weiss), da ich nen Mac Rechner habe. VisualStudio über VM is auch kagge, da die Win Lib fehlt.
-
Im Zweifelsfall gibt da einfach mal copy ein.

/EDIT
Im übrigen sollte so ein Fehler gar nicht erst passieren, weil eben, wenn du nämlich das "böse"using namespaceim Header nicht hättest, dann hättest du das Problem auch nicht gehabt. Vor allem gehört es ja auch zum guten Stil, dass man seine eigenen Sachen in einen Namensraum packt und dann hat man solche Probleme auch gar nicht erst.
-
drakon schrieb:
Im Zweifelsfall gibt da einfach mal copy ein.

/EDIT
Im übrigen sollte so ein Fehler gar nicht erst passieren, weil eben, wenn du nämlich das "böse"using namespaceim Header nicht hättest, dann hättest du das Problem auch nicht gehabt. Vor allem gehört es ja auch zum guten Stil, dass man seine eigenen Sachen in einen Namensraum packt und dann hat man solche Probleme auch gar nicht erst.^^ich danke euch nochmal recht herzlich. Super das mir hier so schnell geholfen werden konnte. Man (bzw ich
) denkt halt nicht immer so umfangreich, wenn man vom Prof die Aufgabe gekommt, nur mal schnell ne Methode zu schreiben. Aber nun weiss ich auch, worauf er evtl hinaus wollte 
-
Wie meine Vorredner schon sagten kannst du einfach die STL benutzen.
- deine copy Funktion ist eigentlich std::copy
- deine print Funktion lässt sich über std::copy und ostream iterator lösen
- deine modify Funktion lässt sich über std::transform lösenBtw:
Ich glaube alle linearen STL Container bieten einen Konstruktor an, der ein Paar iteratoren als Argumente akzeptiert.// Statt std::list<int> output( size ); std::copy( input.begin(), input.end(), output.end() ); // besser std::list<int> output( input.begin(), input.end() );
-
Th69 schrieb:
Ganz böse vor allem: "using namespace std;" in der Header-Datei!
Das möchte ich auch nochmal unterstreichen. Ein "using namespace std;" hat in Header-Dateien nichts zu suchen.