Ambigious call to overloaded function
-
Hi
Ich habe gerade versucht mit Templates zu arbeiten, wobei ich folgenden Code erstellt habe:
#include <iostream> template <typename T> void swap(T &a, T &b); using namespace std; int main(){ int i = 10; int j = 20; cout << "i, j = " << i << ", " << j << ".\n"; cout << "Using cimpiler-generated int swapper:\n"; swap(i, j); cout << "Now i, j = " << i << ", " << j << ".\n"; double x = 24.5; double y = 81.7; cout << "x, y = " << x << ", " << y << ".\n"; cout << "Using compiler-generated double swapper:\n"; swap(x, y); cout << "Now x, y = " << x << ", " << y << ".\n"; int exit; cin >> exit; return 0; } template <typename T> void swap(T &a, T &b) { T temp; temp = a; a = b; b = temp; }Soweit ich das ganze verstanden habe, müsste der Code fehlerfrei ausführbar sein. Allerdings liefert mir der Compiler folgende Fehlermeldungen:
(15) : error C2668: 'swap' : ambiguous call to overloaded function
(23) : error C2668: 'swap' : ambiguous call to overloaded functionKann mir jemand erklären, was ich da falsch mache?
-
Zu deutsch: Mehrdeutiger Aufruf zum Überladen der Funktion.
-
Das Englisch ist nicht das Problem... mein Buch, mit dem ich das ganze lerne ist auf Englisch und ich verstehe alles perfekt

Mir ist nur unklar, wiso der Aufruf mehrdeutig ist. So wie ich das verstanden habe, kann man problemlos double oder bool oder int Variablen übergeben. Da die Templates ja generisch sind (so wie ich das verstanden habe ist es in etwas das Gleiche wie Java Generics vom Prinzip her) müsste das ja gehen.
Könntest du mir sagen, was ich explizit in meinem Code ändern muss und wiso?
-
1. Ich weiß, aber das Problem ist dass ich dir da nicht umbedingt helfen kann

- Ich glaub ich lass das Kommentar das nächst mal.btw:
int exit; cin >> exit; return 0;das ist nicht schön !
-
Lol, alles klar ^^
Der Schlussteil ist nur dazu da, dass das Fenster nicht geschlossen wird, nachdem der Code ausgeführt wurde. Je nach IDE und Compiler muss man das anfügen, sonst sieht man die Ergebnisse gar nie.
Kann mir jemand sagen, wie ich mein Problem lösen kann?
-
Lass das using namespace std; weg. Das Problem ist, dass es im Namensraum std bereits eine Funktion swap gibt. Der Compiler kann jetzt aber nicht entscheiden ob dein Template verwendet werden soll oder das aus std.
Schreib stattdessen entweder explizit std::cout und std::cin oder verwende using std::cout; und using std::cin;
-
Achso, jetzt ist mir klar, warum die Function im Buch Swap und nicht swap heisst. Ich habe die Methode jetzt kurzerhand umbenannt.
Vielen Danke für deine Hilfe

-
icarus2 schrieb:
Lol, alles klar ^^
Der Schlussteil ist nur dazu da, dass das Fenster nicht geschlossen wird, nachdem der Code ausgeführt wurde. Je nach IDE und Compiler muss man das anfügen, sonst sieht man die Ergebnisse gar nie.
Kann mir jemand sagen, wie ich mein Problem lösen kann?
da gibts ne bessere Methode im faq
mit cin.get()
cin.clear()
etc.Das man das dann nicht sieht ist mir schon klar
hab nicht umsonst auch mal Console gemacht.
-
im Übrigen gibt der Compiler normalerweise mehr als nur die Fehlermeldung an, in dem Fall normalerweise die beiden Kandidaten zwischen denen er sich nicht entscheiden kann.
-
Ja, es gab mehr Fehlermeldungen... viele Zeilen sogar ^^
Aber ich dachte, dass die beiden Zeilen wohl die wichtigsten sind. Da habe ich mal nur die gepostet.
-
Gibt es in C++ nicht schon per default diese swap Funktion? Versuch mal den Namen ein wenig umzuaendern.
-
Jap, die Funktion wird klein geschrieben, swap(..)
Genau das war das Problem, dass ich zuerst die Funktion swap() geschrieben habe, als Swap() wie es in der Übung geschrieben wurde. Deswegen gabs dann auch Probleme.Das war nur ein Beispiel im Buch, um das Prinzip der Templates zu zeigen.
-
Alternativ könntest du auch sparsamer mit
using namespaceumgehen.
-
Jup, das wäre auch ne Lösung, danke für den Hinweis.