Namespace und ihre Auswirkungen
-
Grüße in die Runde !
ich sitz gerade an einem kleinen Übungsbeispiel aus einem Programierbuch zum Thema Namespaces und hänge jetzt hier:
namespace test { //using namespace std; enum colors { rot, blau, gruen, schwarz }; int n; namespace alpha { double x = 1.05; } } namespace beta { using namespace test::alpha; double f(int, double); } namespace test { const int m = 0; } int main() { using namespace test::alpha; using namespace test; x = 12.5; n = 1; cout << rot << endl; alpha::x(3, 2.0); n = 2; x = 2.02; beta::f(n, x); beta::f(m, x); using namespace beta; f(n, x); return 0; }
Ich bekomme aber immer die Fehlermeldung:
C:\test2.cpp(30) : error C2064: Ausdruck ergibt keine Funktion
Zeile 30 ist die: alpha::x(3, 2.0);und beim Linken:
Nichtaufgeloestes externes Symbol "double __cdecl beta::f(int,double)" (?f@beta@@YANHN@Z)
Das verwirrt und beschäftigt mich irgendwie
-
Das mit dem alpha::x(/.../) ist ein Fehler. Da x ja keine Funktion ist, sondern eine Variable.
Das du beim Linken ein Fehler erhälst liegt daran, da du beta::f nur deklarierst, aber nicht implementierst.
-
Also ich würde mal sagen:
DerWurm schrieb:
C:\test2.cpp(30) : error C2064: Ausdruck ergibt keine Funktion
Zeile 30 ist die: alpha::x(3, 2.0);Das ist richtig, denn alpha::x ist
namespace alpha { double x = 1.05; }
Also eine double-Variable und keine Funktion.
DerWurm schrieb:
Nichtaufgeloestes externes Symbol "double __cdecl beta::f(int,double)" (?f@beta@@YANHN@Z)
Das ist auch richtig, denn wo wird double f(int, double); definiert??
Nirgendwo. Deswegen kann der Linker das auch nicht finden.
Alles in allem liegen die Fehler also nicht in den Namespaces sondern anderswo.
Ich hoffe, ich konnte dir helfen.
Felix
EDIT: Bisschen zu spät
-
Ich weiß gar ned ob ich das richtig verstehe, aber diese Namespaces haben hier doch nur den einen Sinn - und zwar die Variablen solange zu verstecken bis ich sie benötige, oder ??
ich hab mir mal rausgeschrieben was das programm meiner meinung nach macht - vielleicht kann mich ja jemand verbessern / ergänzen
int main() { using namespace test::alpha; using namespace test;
Das Programm lädt hier die beiden Namespaces und ich hab ab hier Zugriff auf die Membervariablen und -Methoden
x = 12.5; n = 1; cout << rot << endl;
Da der Test-Namespace schon geladen ist, kann ich mir "rot" ausgeben lassen
//alpha::x(3,2.0); n = 2; x = 2.02;
alpha::x macht ja hier überhaupt keinen sinn, oder ?
kann man das irgendwie so erweitern dass es was bringtn ??beta::f(n, x); beta::f(m, x);
Ich weiß leider nicht was die Methode f überhaupt macht !?
Ist das eine Methode ? was bringt die ? was liefert die zurück ?using namespace beta; f(n, x); return 0; }
-
Danke, da haben sich während meiner Schriftführung schon einige Probleme gelöst :):)
jetzt stehe ich nur noch vor einem:
namespace beta { using namespace test::alpha; double f(int, double); }
wie kann ich diese Methode sinnvoll ausprogrammieren ?
ist das irgendeine besondere Schreibweise bei der Benutzung von Namespaces ?
oder stimmt das so überhaupt nicht...ich würde das Problem halt so lösen:
namespace beta { using namespace test::alpha; double f(int x, double y){ return x+y; } }
oder ist das totaler Blödsinn ?
Danke nochaml für die ganze Hilfe !!!!