NULL Pointer uebergeben
-
Hallo Zusammen,
Ich habe eine Frage im Bezug auf Pointeruebergabe:
An einem Rechner wird dieser Aufruf kompiliert:
Test* testo = new Test(filename, remote, remote_port, NULL) ;
Allerdings an einem anderen Rechner dieser Funktionsaufruf mit NULL Pointer
uebergabe funktioniert nicht. Ich muesste indirekt machen:Task* indirekt = NULL ; Test* testo = new Test(filename, remote, remote_port, indirekt) ;
Meine Code wird an beiden Rechnern mit g++ kompiliert. Was ist da unterschiedlich dann eingestellt?
Wie kann ich den Kompiler dazu beibringen dass er NULL Parameter direkt
annehmen soll?Danke im voraus,
-
Was heisst denn "funktioniert nicht"? Wie lautet die Fehlermeldung?
-
Wie ist denn der Konstruktor von Test deklariert?
-
Tachyon schrieb:
Was heisst denn "funktioniert nicht"? Wie lautet die Fehlermeldung?
main.cpp:156: error: call of overloaded ‘Test(char [256], ost::IPV4Host*&, int&, NULL)’ is ambiguous g++: Internal error: Aborted (program cc1plus) Please submit a full bug report. See <URL:http://bugs.gentoo.org/> for instructions. make: *** [main.o] Error 1
David_pb schrieb:
Wie ist denn der Konstruktor von Test deklariert?
public: Test(char* filename, InetHostAddress *iha, int port, Task* task); Test(char* filename, InetHostAddress *iha, int port_ue, int proc_port) ; // .... Test.h geht weiter
Der Portal ist recht langsam und manchmal nicht erreichbar momentan..
gibt's
DoS Attacke gerade?
-
Da hast du dein Problem doch. Der Compiler weiß nicht welchen deiner Konstruktoren er aufrufen soll...
-
Weil NULL eben 0 ist. Das ist kompatibel zu den Typen Task* und int.
Abhilfe sollte das schaffen:Test* testo = new Test(filename, remote, remote_port, static_cast<Task*>(NULL)) ;
-
simon.gysi schrieb:
Weil NULL eben 0 ist. Abhilfe sollte das schaffen:
Test* testo = new Test(filename, remote, remote_port, static_cast<Task*>(NULL)) ;
super, danke. hab gleich static cast gemacht und es funktioniert.
Das ist kompatibel zu den Typen Task* und int.
Fuer Verstaendnis: Wenn es kompatibel mit Typ Task* ist, sollte dann ohne
cast auch gehen oder? Ist es eher dann nicht "inkompatibel" ?
-
Das Problem ist, dass NULL einfach nur 0 ist, und 0 ist implizit zu einem Pointer konvertierbar.
Deswegen weiß der Compiler nicht, ob er NULL als int oder als T* (T = irgendein Typ) auffassen soll.
Im nächsten Standard wird es jedoch dafür eine Lösung geben:
nullptr
-
Das Problem ist eben gerade, dass NULL zu beiden Typen kompatibel ist. Welchen Konstruktor soll er denn nehmen?
-
Ich habe da das Gefühl, da ist was mit der Compilerversion im Busch.
Oder NULL ist nicht wie üblich mit...#define NULL 0
definiert.
Denn dann wäre Dein CtorTest(char* filename, InetHostAddress *iha, int port_ue, int proc_port);
gemäß Standard nämlich erstmal der passende, da NULL erstmal ein Integer ist. Der Standard sagt zwar, dass R-Werte den den Wert 0 haben implizit in einen Pointer gecastet werden dürfen, Jedoch findet der Cast erst statt, wenn nichts gefunden wird, das besser passt.
Der "Internal Error" macht auch skeptisch.Vielleicht ist auch bei dem Compiler, bei dem es den Fehler gibt, NULL irgendwie anders definiert.
-
Ich danke euch fuer ne ausfuehrliche Erklaerung. Mit dem Beispiel habe ich
leicht uebersehbare Detail verstanden...Tachyon schrieb:
Der "Internal Error" macht auch skeptisch.
Mich auch.. jedesmal wenn der Kode nicht kompiliert werden kann, bekomme
ich die internal error Fehlermeldung. Ich muss mich schnellst darum
kuemmern..keine Ahnung weswegen..Gruss,