Source code |
|
1 |
myvector< int > var; |
Source code |
|
1 |
myvector < int > var(n); |
Source code |
|
1 2 3 |
c:...myvector.h(23) : error C2668: '[]' : ambiguous call to overloaded function c:...myvector.h(23) : while compiling class-template member function 'int &__thiscall myvector < int,class std::allocator < int > > ::operator [](u nsigned int)' |
Erfahrener Schreiberling
Date of registration: Oct 9th 2002
Location: da drüben, gleich dort.
Occupation: Warum? Hmm, weil ich sonst nix mit meiner Zeit anzufangen weiß :D
Quelle MSDNQuoted
[Compiler Error C2668]
"Funktion": Mehrdeutiger Aufruf einer überladenen Funktion
Der angegebene Aufruf der überladenen Funktion lässt sich nicht auflösen. Sie können eine explizite Typumwandlung für einen oder mehrere der übergebenen Parameter durchführen.
Dieser Fehler kann auch durch die Verwendung von Vorlagen hervorgerufen werden. Wenn in einer Klasse eine reguläre Memberfunktion und eine aus einer Vorlage gebildete Memberfunktion mit derselben Signatur enthalten ist, muss letztere zuerst genannt werden. Diese Beschränkung gilt für die aktuelle Implementierung von Visual C++.
Weitere Informationen zur Bestellung einzelner Funktionsvorlagen finden Sie im Knowledge Base-Artikel Q240869 (nur auf Englisch verfügbar).
Informationen zum Erstellen eines ATL-Projekts mit einem COM-Objekt, das "ISupportErrorInfo" unterstützt, finden Sie im Knowledge Base-Artikel Q243298 (nur auf Englisch verfügbar).
Beispiel
// C2668.cpp
struct A {};
struct B : A {};
struct X {};
struct D : B, X {};
void func( X, X );
void func( A, B );
D d;
int main()
{
func( d, d ); // C2668, D has an A, B, and X
func( (X)d, (X)d ); // OK, uses func( X, X )
}
Quoted
Original von MAX
Wie gesagt, der Fehler liegt nicht im output stream operator, sondern im [] operator. Der Stream operator benutzt ja auch [] operator. Und was da man casten soll, weiß ich auch nicht. ___In
Quoted
Habe jetzt einfach die Beiden Methoden
reference operator[](size_type __n) {..}
const_reference operator[](size_type __n) const {..}
auskomentiert und plötzlich geht alles. So wie es scheint, haben sich diese Methoden mit den Methoden der Klasse vector nicht vertragen. Ich verstehe auch nicht, warum sie überladen werden, denn es steht im Rumpf der Methode sowieso der Aufruf des [] operators der Klasse vector. Natürlich nicht ganz, davor steht noch irgendein _M_range_check(size_type __n); was das sein soll, weiß ich auch nicht. Vielleicht werde ich hier aufgeklärt!
Quoted
Original von Irishman
@np: Wie ist das jetzt eigentlich mit der Grupenstärke beim Vertiefungskurs? Sind 3 Mann pro Gruppe erlaubt? Ich habe Herrn Reuter auch schon mal diesbezüglich gefragt, aber der wollte erstmal mit Herrn Wolter Rücksprache halten.
Quoted
Zu Aufgabe 2.2
Bei dieser Aufgabe habe ich die read und write Methoden für die Klassen Triangle und Solid(nur write) ohne Probleme implementiert, aber was ist mit der read Routine der Klassen Solid und Scene? Da weiß man doch gar nicht, wieviele Objekte am Anfang eingelesen werden. Ok, bei einer Datei, könnte man sie noch zählen, bzw. mit add Methoden bis EOF hinzufügen können. ABER geht es nicht etwas allgemeiner? Z.B. will ich das ganze von der Konsole eingeben. Wie sieht es damit aus? (Bin schon etwas müde, habe keine Ideen mehr, schlafen gehen? hmm zu früh?)
mfg
MAX
Quoted
Original von MAX
Ich meine aber nicht die Dateisyntax, sondern wenn man ein Solid über die Konsole eingeben soll. Oder ist das gar nicht gewünscht???
Quoted
Original von MAX
Ich meine aber nicht die Dateisyntax, sondern wenn man ein Solid über die Konsole eingeben soll. Oder ist das gar nicht gewünscht???
Quoted
Original von migu
Ach so. Reicht es nicht, wenn als Ende-Zeichen "}" oder "<END>" eingelesen wird? Dann weiß die Einleseroutine ja, was los ist. Und
Quoted
den Vector kann man ja immer um 10 oder mehr Elemente vergrößern, wenn seine Kapazität nicht mehr ausreicht.
Quoted
Wo ist denn der Unterschied, ob man aus der Datei oder von der Konsole liest? Wenn Du in der Konsole ein EOF erzeugen willst, drückst Du einfach CTRL-D, damit sind beide Methoden äquivalent. Ist aber egal, weil lesen aus Dateien reicht.
Quoted
Original von np
Quoted
Original von migu
den Vector kann man ja immer um 10 oder mehr Elemente vergrößern, wenn seine Kapazität nicht mehr ausreicht.
Nein. Das muss man gar nicht, weil sich der vector (und auch der myvector) ja mit jedem push_back von selbst um ein Element vergrößert. Wie er das genau macht, kann (und muss) uns dabei egal sein.
Quoted
Wozu sollen wir die Klasse myvector verwenden? Welchen konkreten Vorteil bietet sie gegenüber std::vector?
Quoted
Original von Irishman
Eine Bereichsüberprüfung bietet der std::vector aber auch, wenn man für den Zugriff auf Vectorelemente die at()-Methode verwendet. Wird ein Index bzw. Iterator übergeben wird, der ausserhalb des Wertebereichs liegt, wird eine Exception geworfen.