std::
-
Hallo!
Ich habe versucht mit
std::string s;
ein String-Objekt anzulegen. Der Compiler meldet aber:
string: Ist kein Element von std.
s: nicht deklarierter Bezeichner
string: nicht deklarierter Bezeichner.Habe es auch versucht std zuerst mit using anzugeben und dann nur noch
string s;
zu schreiben. Geht aber auch nicht.
Ich verwende Visual C++ und dort klappt aber so ein Kontextmenü auf nachdem ich std:: geschrieben habe. Und dort ist string eindeutig drinnen.
Wieso kennt er das nicht?
Hab ich eine Anweisung vergessen oder muss man beim Compiler noch irgendwas einstellen?Außerdem würde mich interessieren was das mit std:: genau ist. Ist ein Namespace, oder? Also praktisch eine Einteilung der Klassen (so wie in VB oder C#). In einem Namespace sind weitere Namespaces oder Klassen drinnen, oder?
Wo befindet sich std (in welche(r/n) Datei(en)) und wie kann man sowas selber schreiben?Mir fehlt da irgendwie der Zusammenhang zwischen Klassen (die ja immer in einer Headerdatei die Prototypen und in einer Quelltextdatei den Code haben) und den Namespaces.
Danke schon mal im Voraus!
mfg
-
Header vergessen zu inkludieren?
-
Hi,
inkludiere <string>
-
Ja, das mit dem Header war es.
Ich hatte <string.h> eingebunden (gibt es ja auch).
Was ist der Unterschied zu <string> (ohne .h)?Kapier das mit den Namespaces nicht so ganz. Wäre euch dankbar wenn mir das jemand erklären könnte (vor allem wie diese ganzen Klassen eigentlich gespeichert sind).
mfg
-
Christoph Redl schrieb:
Was ist der Unterschied zu <string> (ohne .h)?
<string.h> ist eine veraltete C-Header Datei. <string> ist die neue C++ Header Datei.
Christoph Redl schrieb:
Kapier das mit den Namespaces nicht so ganz. Wäre euch dankbar wenn mir das jemand erklären könnte
-
-
Ja, das mit dem Header war es.
Ich hatte <string.h> eingebunden (gibt es ja auch).
Was ist der Unterschied zu <string> (ohne .h)?<string> ist die C++ std::string Klasse. <string.h> declarirt C string Funktionen und Dataen Verschiebungs Funktionen (strlem, memcpy). <cstring> ist wie <string.h> ausser, dass alles im std Namesraum ist.
Ob du jetzt <string.h> oder <cstring> nimmst ist eigentlich nur eine Glaubensfrage.
Kapier das mit den Namespaces nicht so ganz. Wäre euch dankbar wenn mir das jemand erklären könnte (vor allem wie diese ganzen Klassen eigentlich gespeichert sind).
Ein Namesraum ist eigentlich nur eine Gruppe von Funktionen/Klassen die einen gleichen Prefix haben. In C benutzt du LIB_foo um Nameskonflikte aus dem Weg zu gehen in C++ lib::foo. Da der Kompiler Namesräume kennt ist er so schlau und kann sich an manchen Stellen das Prefix hinzudenken. Mit einer using Instruktion teils du dem Kompiler, dass er etwas aus dem Namensraum A behandeln soll als ob es im Namesraum A und B wäre. Wobei B immer der Namesraum ist in der die using Instruktion ist. B kann auch ein Scope sein.
Um es kurz zu fassen : Namesraum sind da um sich Tiparbeit zu sparen und nicht immer das Prefix anzugeben.