C++ vector::push_back mit Standard-copy-Konstruktor
Habe ich eine Klasse (Uniform), die über einen Konstruktor mit 2 Parametern, und eine Standard-copy-Konstruktor (es enthält nur int, schwimmt, ein std::vector und std::map). Ich erstellte eine
std::vector<Uniform> uniforms
will ich füllen mit den
uniforms.push_back()
Linie. Ich benutze diesen code zu tun (die 2. Zeile ist nur hier zum testen des copy-Konstruktor, wie es derzeit nicht)
Uniform uni(uniform_name,type);
Uniform uni2=uni;
uniforms.push_back(uni2);
Den default-Konstruktor funktioniert gut, die "uni2=uni" kompiliert ohne Probleme (also der default-copy-Konstruktor ist auch OK), aber die push_back gibt (mit g++ als compiler):
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../include/c++/4.6.0/ext/new_allocator.h:108:9: erreur: keine passende Funktion für Aufruf von " Uniform::Uniform(const Uniform&)'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../include/c++/4.6.0/ext/new_allocator.h:108:9: Anmerkung: Kandidaten sind:
./inc/uniform.h:16:5: Anmerkung: Uniform::Uniform(std::string, Uniform_Type)
./inc/uniform.h:16:5: Anmerkung: Kandidat erwartet 2 Argumente 1 zur Verfügung gestellt
./inc/uniform.h:14:7: Hinweis: - Uniform::Uniform(Einheitliche&)
./inc/uniform.h:14:7: Anmerkung: keine bekannte Umwandlung für argument 1 von 'const Uniform' zu 'Uniform&'
Dank 🙂
- Erstens, wo ist die definition von
Uniform
? Zweitens, stoppen Sie missbrauchen den Begriff "Standard". "Default" hat eine sehr spezifische Bedeutung in C++. "Default-Konstruktor" und "Kopie-Konstruktor" sind zwei völlig verschiedene Dinge in C++. In Ihrem Fall default-Konstruktor ist nicht auf allen beteiligten. - Sie sollten auch Blick auf diese Frage, denn Sie haben genau das gleiche problem: stackoverflow.com/questions/6302899/...
- Als AndreyT gesagt, poste bitte code, der (im Idealfall, der kompiliert werden kann, produzieren die Symptome beschrieben) anstelle von Beschreibung der code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sagen, "default copy constructor" (die in der Regel wenig Sinn macht), ich nehme an, du meinst "implizit deklarierte Kopie-Konstruktor" oder "compiler bereitgestellte Kopie-Konstruktor"
Die genaue Signatur der compiler-copy Konstruktor zur Verfügung gestellt wird, hängt vom Inhalt Ihrer
Uniform
Klasse. Könnte es seinUniform::Uniform(const Uniform &)
oderUniform::Uniform(Uniform &)
je, wieder, auf die details zuUniform
(was Sie nicht bieten).Zum Beispiel, wenn Ihr
Uniform
umfasst ein Unterobjekt (Basis oder member) der TypT
, deren copy-Konstruktor deklariert ist, soT::T(T &)
(keineconst
), dannUniform
's implizite Konstruktor wird auch implizit deklariert alsUniform::Uniform(Uniform &)
(keineconst
).Eine vollständige Spezifikation finden Sie in der standard-Sprache (12.8/5)
Den
push_back
Umsetzung mussUniform::Uniform(const Uniform &)
, aber etwas in Ihrer Klasse bewirkt, dass esUniform::Uniform(Uniform &)
. Daher der Fehler. Es gibt keine Möglichkeit zu sagen, was es ist, ohne zu sehen, die definition derUniform
.Uniform
könnte, dass der compiler erzeugt nun eine Kopie Konstruktor, der eine non-const Referenz-parameter?const
qualifiziert parameter, so die implizit-deklarierten Kopier-Konstruktor wird auch nichtconst
qualifiziert.Ihre Kopie-Konstruktor benötigt, um zu nehmen sein argument als const Referenz:
Ihre Kopie-Konstruktor akzeptieren sollte
const Uniform&
und nichtUniform&
als die, die Sie tut.Konnte Sie nicht fügen Sie die Kopie-Konstruktor (sic!!!) aber Sie müssen definiert es falsch:
sein sollte (beachten Sie die const)