Hallo Liste!
Ich möchte mehrere Programme für fli4l (2.0.8) übersetzen. Da dort die libc5 verwendet wird, habe ich die entsprechenden altdev-Pakete installiert (altgcc, libc5-altdev, libg++27-altdev). Dann habe ich im Makefile die Pfade für GCC und G++ angepasst. Doch leider läuft die Übersetzung nicht durch:
$make /usr/i486-linuxlibc1/bin/c++ sd_listcalls.cpp connect.o sd.o -o sd_listcalls -lstdc++ In file included from sd.hpp:16, from sd_listcalls.cpp:4: connect.hpp:15: warning: namespaces are mostly broken in this version of g++ sd_listcalls.cpp: In function `int main(int, char **)': sd_listcalls.cpp:17: incorrect number of parameters (1, should be 2) /usr/i486-linuxlibc1/include/g++/set.h:27: in template expansion for decl `template <class Key, class Compare> class set' sd_listcalls.cpp:53: request for member `insert' in `msn', which is of non-aggregate type `int' sd_listcalls.cpp:70: request for member `empty' in `msn', which is of non-aggregate type `int' sd_listcalls.cpp:70: request for member `find' in `msn', which is of non-aggregate type `int' sd_listcalls.cpp:70: request for member `end' in `msn', which is of non-aggregate type `int' make: *** [sd_listcalls] Fehler 1
Offenbar ist das set-Template kaputt. Wenn ich beim Initialisieren von set noch einen Parameter mehr angebe, hagelt es Bildschirmweise Fehlermeldungen. Und mit neuerem g++ läuft die Übersetzung ja auch problemlos durch. Hier der verursachende Codeschnipsel:
15:int main(int argc, char** argv) 16:{ 17: set<string> msn;
Leider habe ich von C++ nicht soviel Ahnung, als das ich das set-Template korrigieren könnte.
Hat vielleicht jemand eine Idee, wie ich das doch noch hinbekomme? Gibt es einen Workaround für das Set-Template (und für das map-Template, was wahrscheinlich auch kaputt ist)?
Bert
P.S.: Prinzipiell läuft die Geschichte, die anderen Programm die nicht das set-Template nutzen laufen schon.
On Sat, Jan 01, 2005 at 09:37:55PM +0100, Bert Lange wrote:
Hallo Liste!
Ich möchte mehrere Programme für fli4l (2.0.8) übersetzen. Da dort die libc5 verwendet wird, habe ich die entsprechenden altdev-Pakete installiert (altgcc, libc5-altdev, libg++27-altdev). Dann habe ich im Makefile die Pfade für GCC und G++ angepasst. Doch leider läuft die Übersetzung nicht durch:
Wow, gcc-2.7.2 ist ja ueber 5 Jahre alt. Erstaunlich, dass es noch Leute gibt, die diesen Compiler benutzen.
Zu den Fehlern:
$make /usr/i486-linuxlibc1/bin/c++ sd_listcalls.cpp connect.o sd.o -o sd_listcalls -lstdc++ In file included from sd.hpp:16, from sd_listcalls.cpp:4: connect.hpp:15: warning: namespaces are mostly broken in this version of g++ sd_listcalls.cpp: In function `int main(int, char **)': sd_listcalls.cpp:17: incorrect number of parameters (1, should be 2) /usr/i486-linuxlibc1/include/g++/set.h:27: in template expansion for decl `template <class Key, class Compare> class set'
Die ueblichen Klassen in der STL verwenden AFAIR 2-3 Parameter; den Typ, ein Vergleichsobjekt (man kann benutzerdefiniert festlegen, was "groesser als" in einer sortierten Liste bedeutet) und eine Funktion zum Alloziieren von Speicher. Ueblicherweise sind die letzteren Parameter mit default-Werten versehen. Da dieser gcc steinalt ist, besteht die Moeglichkeit, dass er mit Standardwerten fuer Templates nicht richtig umgehen kann. Wenn ich mich richtig entsinne, wurde ja egcs damals abgespalten, weil der Standard-gcc den C++-Standard so schlecht unterstuetzt hat. Wenn du Pech hast und die Lage so ist, bleibt dann nur das per-Hand-Patchen als Option uebrig.
sd_listcalls.cpp:53: request for member `insert' in `msn', which is of non-aggregate type `int' sd_listcalls.cpp:70: request for member `empty' in `msn', which is of non-aggregate type `int' sd_listcalls.cpp:70: request for member `find' in `msn', which is of non-aggregate type `int' sd_listcalls.cpp:70: request for member `end' in `msn', which is of non-aggregate type `int' make: *** [sd_listcalls] Fehler 1
Das koennten moeglicherweise nur Folgefehler sein. Der Compiler kam mit der Deklaration von "msn" nicht klar und hat der Variable standardmaessig als integer festgelegt. Das ist immer noch das Standardverhalten des gcc, deswegen vermute ich mal, dass das stimmt. :)
Offenbar ist das set-Template kaputt. Wenn ich beim Initialisieren von set noch einen Parameter mehr angebe, hagelt es Bildschirmweise Fehlermeldungen. Und mit neuerem g++ läuft die Übersetzung ja auch problemlos durch. Hier der verursachende Codeschnipsel:
15:int main(int argc, char** argv) 16:{ 17: set<string> msn;
Leider habe ich von C++ nicht soviel Ahnung, als das ich das set-Template korrigieren könnte.
Der weitere Parameter musste eine Vergleichsklasse sein. Allerdings habe ich das Feature ewig nicht genutzt, da weiss ich auch nicht mehr aus dem Kopf, wie das funktioniert hat.
Hat vielleicht jemand eine Idee, wie ich das doch noch hinbekomme? Gibt es einen Workaround für das Set-Template (und für das map-Template, was wahrscheinlich auch kaputt ist)?
Wenn ich meinen Stroustrup wieder zur Hand habe, kann ich dir da vielleicht helfen.
cu, Ulf
lug-dd@mailman.schlittermann.de