Frage zu compile mysterium (für mich zumindest)
-
Hallo,
ich habe 2 Versionen die 1. kompiliert die 2. nicht. Ich habe keine Ahnung warum. Unter Vc6.x kompilieren beide. Sonstige (Comeau, 7.0,8.0) kompiliert die 2. nicht.
Version 1:#include <vector> using std::vector; struct Class1IF { }; class Class1 : public Class1IF { public: Class1(vector<int> t) { } }; class Class2 { public: Class2(Class1IF& a) { } }; int main(int argc, char **argv) { //hier ist der Unterschied vector<int> test; Class1 class1(test); Class2 class2(class1); }Version 2:
#include <vector> using std::vector; struct Class1IF { }; class Class1 : public Class1IF { public: Class1(vector<int> t) { } }; class Class2 { public: Class2(Class1IF& a) { } }; int main(int argc, char **argv) { vector<int> test; Class1 class1(vector<int>()); Class2 test2(class1); }
-
Fragezeichen_ schrieb:
ich habe 2 Versionen die 1. kompiliert die 2. nicht.
Aha. "kompiliert nicht" - sehr intressant!
-
Konstruktive Vorschläge sind immer willkomen. Den Benutzernamen hättest Du Dir allerdings sparen können. Ansonsten fand ich meinen Post nicht so schlecht.
Wird der Beitrag nicht gelöscht war das meine letzte Aktivität in diesem Forum.Hier der output von Comeau via html andere compiler habe ich leider nicht zur Hand
Comeau schrieb:
"ComeauTest.c", line 33: error: no instance of constructor "Class2::Class2" matches
the argument list
The argument types that you used are: (Class1 (std::vector<int, std::allocator<int>>
(*)()))
Class2 test2(class1);
^1 error detected in the compilation of "ComeauTest.c".
-
Hey lass dich doch von so ein idiot nicht fertig machen

sorry aber ich kann dir in dein jetzigen problem nicht weiter helfen da ich mich nin klassen noch nicht so gut auskenne warte einfach bist du eine Inteligentere Antworst bekommst
Ich find solche idioten voll nervig
-
mingw kompiliert die zweite variante auch nicht. wenn ich die instanz von Class1 per new erzeuge und mittels dereferenzoperator übergebe klappts.
frag mich, was da quer schiesst, bin ebenso ratlos ^^
_edit_
doch nich ratlos. das problem sind die () hinterm vector. spielt dabei keine rolle, obs ne template klasse oder irgendwas anderes ist. die () sind kein leerer konstruktoraufruf. die übergeben das template als funktion (oder so ähnlich), was nich hinhaut. da macht der compiler irgendnen müll draus. evtl. undefiniertes verhalten.
-
Ja ich dachte bis jetzt immer es wird einfach ein temporäres Objekt angelegt.
Wenn es an dieser Stelle ein Problem gäbe wäre es "OK", aber es gibt ja erst bei der übergabe an den 2. ctor ein Problem. Das versteh ich nach wie vor nicht
-
Fragezeichen_ schrieb:
Konstruktive Vorschläge sind immer willkomen. Den Benutzernamen hättest Du Dir allerdings sparen können. Ansonsten fand ich meinen Post nicht so schlecht.
Ich sag dir trotzdem den Grund:
Das Problem liegt nicht in Zeile 33, sondern 31:
Class1 class1(vector<int>());Dieses Konstrukt erstellt kein Objekt, sondern deklariert eine Funktion [afaik]. Hab das mal irgendwo gelesen (glaub C++ FAQ lite, musst mal schauen).
Das ganze lässt sich so lösen:
Class1 class1((vector<int>())); // oder Class1 class1 = Class1(vector<int>());lg - du idiot [2]
[1] http://www.parashift.com/c++-faq-lite/
[2] Das mist mein Nick!
-
du idiot schrieb:
Das ganze lässt sich so lösen:
Class1 class1((vector<int>())); // oder Class1 class1 = Class1(vector<int>());Lässt sich auch einfacher, sofern der ctor nicht explicit ist, was ja hier der Fall ist, lösen:
class1 class1 = vector<int>();
-
Hi,
wenn ich auch "idiot"s Vorgehensweise nicht gut finde, so hat er doch Recht, was die Compilermeldung angeht (sowohl, dass es sinnvoll ist, sie gleich zu posten als auch ihre Bedeutung).
Der Compiler sagt ja "klar&deutlich"
:
"no instance of constructor "Class2::Class2" matches the argument list..."
=> Kein Ctor mit passender Arugmentliste gefunden."The argument types that you used are: (Class1 (std::vector<int, std::allocator<int>> ()()))"
=> Du nutzt Argumentliste: "std::vector<int, std::allocator<int>> ()()))"Das ist erstmal ein wenig unübersichtlich, aber wenn Du den vector-Ausdruck reduzierst zu einem X
=> X (*)()Das ist der Typ "Funktion, die void entgegennimmt und ein X zurückgibt".
Sieht man als Mensch leider nicht so schnell, aber dafür gibt es ja den Compiler, damit er uns darauf hinweist.
Gruß,
Simon2.
P.S.: Ist übrigens kein "blöder Fehler" ... ist ziemlich Vielen schon passiert. Meistens gerade denen, die ihn jetzt schnell erkennen. :p
-
Danke an Du Idot und Simon2:
Was ich noch nicht verstehe...
Der compiler beschwert sich wie gesagt so:
no instance of constructor "Class2::Class2" matches the argument list..."
Meine argumentliste von Class2::Class2 ist nicht vector<int>() sondern class1 oder? Mein ctor von Class2 erwartet nur eine Referenz auf ein interface Class1IF und die gebe ich ihm ???
-
class1 ist aber keine Instanz vom Typ Class1, sondern wie bereits erwähnt eine Funktionsdeklaration. Deshalb kann Class2 einfach keine neue Instanz mit class1 erzeugen, da die Klasse dafür einfach keinen passenden ctor hat.