Problem mit Konvertierungskonstruktor
-
Hallo @ all,
hier ein minimales Beispiel meines Problems:class Test { public: Test() {} Test(int d) {} Test a() { return 4; } }; int main() { Test b; Test c=b.a(); }Mein Compiler (TDM-GCC 4.5.0) zeigt dabei folgenden Fehler an:
test.cpp:10:8: error: no matching function for call to Test::Test() test.cpp:4:3: note: candidates are: Test::Test(int) test.cpp:2:1: note: Test::Test(const Test&)Eigentlich sollte der Konvertierungskonstruktor benutzt werden um den int in ein Objekt des Typs Test zu überführen. Was der Compiler aber nicht macht. Auch wenn ich folgende Zeile benutze funktioniert es nicht (gleicher Fehler):
return Test(4);Wessen Fehler ist das: meiner oder der des Compilers
.Grüsse
player424
-
Hi,
deiner

Und zwar fehlt der Default-Konstruktor hier:
Test b;
-
Ok danke, aber diesen Fehler habe ich jetzt nur bei diesem Beispiel gemacht. Ich ergänze das eben.
-
Jetzt gibt es aber eine 'matching function for call to Test::Test()'. Bist du sicher, dass mit dem Beispiel derselbe Fehler auftritt?
-
Ja jetzt kompiliert er das Minimalbeispiel
. Ich poste einmal den Code in dem Das Problem auftritt.class Socket { public: Socket(); Socket(const char *, int); Socket(Socket&); Socket(SOCKET); ~Socket(); void Connect(const char *, int); void Write(const void *, int); void Read(void *, int); void Bind(int); void Listen(int); Socket Accept(); void Close(); Socket& operator=(const Socket&); Socket& operator<<(const std::string&); Socket& operator<<(int); Socket& operator<<(float); Socket& operator>>(int&); Socket& operator>>(float&); SOCKET GetDescriptor() const; private: SOCKET s; static int numInstances; static void InitWinsock() { WSADATA wsa; if (WSAStartup(MAKEWORD(2,2), &wsa)!=0) throw SocketException("WSAStartup failed"); } };Hier die Methode in der der Fehler auftritt
Socket Socket::Accept() { SOCKET descriptor; descriptor = accept(s, NULL, NULL); if (descriptor==INVALID_SOCKET) throw SocketException("Accept gescheitert"); return descriptor; }Edit:
Hier noch die Fehlermeldung des Compilersno matching function for call to Socket::Socket(Socket) Als candidates zeigt er an: Socket::Socket(SOCKET) Socket::Socket(Socket&) Socket::Socket(const char *, int) Socket::Socket()
-
Du hast keinen Kopierkonstruktor. Hat das einen bestimmten Grund, dass
Socket::Socket(Socket&)eine nicht-const-Referenz nimmt?
-
Doch das "Socket::Socket(Socket&)" ist doch der Kopierkonstruktor. Was die const-Referenz angeht: es hat keinen bestimmten Grund. Das werde ich später noch ändern.
-
player424 schrieb:
Doch das "Socket::Socket(Socket&)" ist doch der Kopierkonstruktor.
Genau. Und was meint wohl der Compiler in Ausdrücken wie
Socket a = sock.Acceppt(), wenn der Kopierkonstruktor (von a) eine nicht konstante Referenz verlangt und einen R-Value bekommt? Also mach eine const-Referenz draus
-
OK, dann ist das vielleicht auch ein Kopierkonstruktor. Aber keiner, der an der Stelle anwendbar ist

edit: Das Problem entsteht schon beim return, da der return-Ausdruck ja das Ergebnis einer impliziten Konvertierung und damit ein temporäres Objekt ist, welches nur an const-Referenzen gebunden werden kann.
-
Bashar schrieb:
edit: Das Problem entsteht schon beim return, da der return-Ausdruck ja das Ergebnis einer impliziten Konvertierung und damit ein temporäres Objekt ist, welches nur an const-Referenzen gebunden werden kann.
Stimmt. Ich hatte überlesen, dass
descriptorein SOCKET und kein Socket ist.
-
Nun funktioniert es
.Vielen Dank für eure Hilfe.