Keine Konvertierung von long unsigned int long unsigned int&
Erhalte ich die Fehlermeldung Keine bekannte Umwandlung für argument 2 von long unsigned int
zu long unsigned int&
wenn ich versuche zu kompilieren, den folgenden code:
void build(int* &array, unsigned long& index) {
if (index == 0)
return;
else {
heapify(array, index);
build(array, index-1);
}
}
Kann jemand erklären, warum dies geschieht, und was die Logik hinter diesem Fehler?
- Danke Euch allen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das zweite argument von
build
erfordert einen Verweis (markiert mit&
). Eine Referenz ist eine Art Zeiger, so dass Sie nur verwenden können, eine wirkliche variable, die eine Speicher-Adresse.Dies ist der Grund, warum Sie nicht verwenden können, einen Ausdruck wie
index-1
.Einer nicht-const-Referenz kann nur gebunden werden, um ein lvalue in C++.
index-1
gibt eine temporäre, die, wenn Sie an einer Referenz würde sofort gehen, out of scope, und Sie hätten eine dangling reference. Eine const-Referenz kann gebunden werden, um eine vorübergehende aber, und es verlängert die Lebensdauer der temporären auf die Lebensdauer der const-Referenz. Also, wenn Sie ändern, könnenunsigned long&
zuconst unsigned long&
sollte es funktionieren.Das zweite argument von
build
ist ein Verweis aufunsigned long
. Aber in den rekursiven aufrufen, übergeben Sie es einem tatsächlichen Wert (also "rvalue").Wenn Sie schreiben Sie die Funktion wie folgt, sollte das problem verschwinden.
Aber beachten Sie, dass dies möglicherweise nicht, was Sie wollen. Der Wert von
index
wird geändert werden, bevor der rekursive Aufruf. Möchten Sie vielleicht ändern Sie es zurück (index += 1
) nach dem Aufruf, je nachdem, was der Zweck der Funktion ist.Sehen Das Design und Evolution von C++, Kapitel 3.7, p86, das gibt dieses Beispiel:
In der ersten version von C++ eine temporäre Typ
int
wurde von derdouble
mit Wert1
, dann, dass temporäre übergebenincr
undss
wurde nicht geändert. Um zu verhindern, dass diese Art von unerwarteten Verhalten, die Sprache wurde verändert, so dass eine vorübergehende (D. H. eine Unbenannte variable) binden können, um eine nicht-const-Referenz, da eine nicht-const Referenz-parameter in der Regel impliziert, dass die parameter verändert werden, die zur Weiterleitung von Informationen zurück an den Aufrufer. Wenn eine temporäre wird im hintergrund erstellt der Anrufer verliert, dass Informationen, z.B.Wenn ein nicht-const-Referenz zulässig ist, zu binden, um ein temporäres dann ist dieses Programm ist gefährlich, weil
get_ptr(err)
erstellen Sie einen temporärenint
wieget_ptr(int(err))
, und legen Sie die error-status in der temporären, alsoerr
noch null, auch wenn es ein problem gibt.Wenn die Funktion Autor will in der Lage sein zu akzeptieren, Provisorien, weil das argument nicht verwendet, um Informationen an den Aufrufer zurück, dann die Funktion kann Parameter haben, die von Wert:
oder per const-Referenz:
welche Zeile ist deine Fehlermeldung auf? Es scheint, wie Sie auf der Durchreise sind, in einem
long unsigned int
für den index, wenn es Sie braucht einlong unsigned int
durch Verweis (in anderen Worten, die Adresse deslong unsigned int
)build(array,index-1);