Was soll das nu' wieder (verschachtelte namespaces)
-
Mein VC++ 6 Compiler hat irgendwie große Probleme mit verschachtelten namespaces...
Ich hatte eine template Funktion. Mit verschiedenen Typen hab ich die Funktion aus einer anderen Funktion, die sich in einem verschachtelten namespace befand aufgerufen. Der Linker schimpfte dann über unaufgelöste Symbole. Irgendwie hab ich dann in der main() Funktion die Templatefunktion mit dem Typ int aufgerufen und die Fehlerzahl hat sich um 1 reduziert, schließlich wurde das Problem durch diese Zeilen gelöst, die direkt am Anfang nach main() stehen
//??? ValToHex((int) 0, 0,""); ValToHex((unsigned short) 0, 0, ""); ValToHex((unsigned char) 0, 0, ""); ValToHex((short) 0, 0, "");Keine Ahnung, was das soll, das kann doch nicht normal sein?!
Nun treten die nächsten Probleme auf, die mir ehrlich gesagt langsam die Lust am programmieren nehmen... Man sucht Tag für Tag nach irgendeinem seltsamen Fehler, den man wahrscheinlich nicht einmal selbst verursacht hat:
Es gibt folgende namespaces:
Dbg::Win
Dbg::Gtk
Ev::Win
Ev::Gtk
Der Compiler behauptet in folgendem Wortlaut: "'Gtk' : is not a member of 'Ev'"
wo ich doch gerade dabei bin, herauszufinden, warum die GTK+ Funktionen trotz eingebundener GTK+ Headerdateien, vom Compiler herablassend als "undeclared identifiers" bezeichnet werden............
-
Na, die Probleme werden schon durch Dich verursacht sein.
z.B. falsche abhängigkeiten der Header.a.h #include "b.h" namespace A { }; b.h #include "a.h" namespace B { A::irgendwas }Damit wird in b.h z.B. der Fehler auftauchen,d as es keinen Namespace A gibt.
Ohne Quellcode lässt sich zu Deinem Problem nichts sagen - bzw. wo war da noch mal die Frage ?
-
Der VC6 wird von so gut wie keiner Lib mehr unterstützt... Schmeiss ihn weg.
-
events_win.cpp
#include "main.h" namespace Ev { namespace WinCon { inline void Init() { } inline void HandleKeyPress() { } } }events_win.h
#if !defined(EVENTS_WIN) #define EVENTS_WIN namespace Ev { namespace WinCon { extern inline void Init(); extern inline void HandleKeyPress(); } } #endif //EVENTS_WINevents_gtk.cpp
#include "main.h" namespace Ev { namespace Gtk { inline void Init() { g_signal_connect(G_OBJECT(gtk_window_new(GTK_WINDOW_TOPLEVEL)), "key_press_event", G_CALLBACK("KeyPress")); } inline void HandleKeyPress() { } static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event, gpointer data) { Cpu::Exec(); } } }events_gtk.h
#if !defined(EVENTS_GTK) #define EVENTS_GTK #include <GTK/GTK.h> namespace Ev { namespace Gtk { extern inline void Init(); extern inline void HandleKeyPress(); static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event, gpointer data); } } #endif //EVENTS_GTKevents.cpp
#include "main.h" namespace Ev { inline void Init() { #if defined(EVENTS_WIN) Ev::WinCon::Init(); #elif defined(EVENTS_GTK) Ev::Gtk::Init(); #endif } inline void HandleKeyPress() { #if defined(EVENTS_WIN) Ev::WinCon::HandleKeyPress(); #elif defined(EVENTS_GTK) Ev::Gtk::HandleKeyPress(); #endif } }events.h
#if !defined(EVENTS_H) #define EVENTS_H //#define EVENTS_WIN #define EVENTS_GTK #if defined(EVENTS_WIN) #include "events_win.h" #elif defined(EVENTS_GTK) #include "events_gtk.h" #endif namespace Ev { extern inline void Init(); /* these handle functions are not needed using interfaces with automatic event callback */ extern inline void HandleKeyPress(); } #endif //EVENTS_H
-
VC++ 6.0 ist wirklich nicht mehr zu gebrauchen. Der erzeugt teilweise wirklich Fehler, die man nicht gemacht hat. Zum Beispiel findet er plötzlich eine Inklude nicht mehr oder sonst was total merkwürdiges.
-
Vergiss es mit Express... ich habs schon mal versucht... Das kann man doch echt vergessen! Ich habs wegen irgendwelchen Fehlern nicht zum laufen gebracht... dieser Fehler treten nur in der Express Edition auf und das Problem konnte von keinem der es auch hatte gelöst werden, was es genau war, weiß ich nicht mehr...
-
Hab noch nie beschwerden diesbezüglich gehört!

-
#include <iostream> void main() { cout << "hallo welt" << endl; }'cout': undeclared identifier 'endl': undeclared identifieralso es funktioniert auch bei dieser installation mal wieder nicht............
-
Doch, es tut genau das was es soll. cout und endl befinden sich nämlich seit dem '98er Standard im Namespace std.
#include <iostream> using namespace std; void main() { // BTW: es heisst auch MINDESTENS seit dem '98er Standard int main cout << "hallo welt" << endl; }
-
MaximumAccessViolation schrieb:
also es funktioniert auch bei dieser installation mal wieder nicht............
Für gewöhnlich sitzt das Problem nicht im sondern vorm Computer!
#include <iostream> int main() { std::cout << "hallo welt" << std::endl; // im Namespace std!!!!!!!!!! }
-
Ihr habt doch alle keine Ahnung.
Es heißt int main.
-
Nun ja... das ist das Problem IM Computer... So hab ich nicht C++ gelernt... Ich hab in VC++ 6 noch nie Std mit angegeben...
-
Das hier:
MaximumAccessViolation schrieb:
Nun ja... das ist das Problem IM Computer...
widerspricht dem hier:
MaximumAccessViolation schrieb:
So hab ich nicht C++ gelernt...
ziemlich. Oder ist der Computer daran schuld, dass Du etwas falsches gelernt hast?
Und dass VC6 das kann ist auch kein Argument, da dieser Compiler ja nun ziemlich veraltet ist.
-
Ich sag nur '98er Standard. Alles andere ist nicht (mehr) C++.
-
MaximumAccessViolation schrieb:
Nun ja... das ist das Problem IM Computer... So hab ich nicht C++ gelernt... Ich hab in VC++ 6 noch nie Std mit angegeben...
Dann hast du kein ISO-C++ gelernt und VC++6 kam in dem Jahr raus, in dem erst vom ISO-Komitee ISO-C++ verabschiedet wurde. VC++6 ist also nicht ISO-konform. Und ISO ist nunmal internationaler Standard. Und an den halten sich neuere Compiler (zum Glück) weitestgehend.
-
Ich hab nie behauptet, dass ich ISO C++ gelernt hab... hab auch noch nie ein tut gesehen, in dem std:: mit angegeben war... egal... std:: nervt irgendwie, soll ich etz meinen kompletten Code nach allen Funktionen, bei denen std:: fehlt durchsuchen? using namespace funktioniert ja nur in der Funktion ...
-
using namespace wird doch über den gesammten Bereich aufgelöst. Es muss halt in jeder Unit in der es gebraucht wird angegeben werden.
Etwas quick und dirty wäre es, das in die stdafx.h zu nehmen - sei jedoch gewarnt das sowas eigentlich keine gute Idee ist.
Was genau meinst Du mit "Funktioniert nur in der Funktion..." ?
-
MaximumAccessViolation schrieb:
Ich hab nie behauptet, dass ich ISO C++ gelernt hab... hab auch noch nie ein tut gesehen, in dem std:: mit angegeben war... egal... std:: nervt irgendwie, soll ich etz meinen kompletten Code nach allen Funktionen, bei denen std:: fehlt durchsuchen? using namespace funktioniert ja nur in der Funktion ...
Nein, du solltest dir mal eher was zum Thema namespaces durchlesen.