Probleme mit namespaces in Source-Datei obwohl es im Header geht
-
Ich habe ein großen Teil C++ Code aus einem anderen Projekt kopiert und möchte diesen über eine Wrapper-Klasse
Parsernutzen:Parser.hpp
... #include "sbmtc/smtparser.hpp" using namespace std; namespace mrm { class Parser { private: const string filename; public: Parser(string _filename); };sbmtcist ein Unterordner in den ich Dateien aus dem anderen Projekt reinkopiert habe. Die Klasse, die ich aus dem anderen Projekt ansprechen will sind alle in einem namespace der ebenfallssbmtcheißt.Wenn ich jetzt den namespace in
Parser.cpp(im Folgenden) z.B. im Constructor ansprechen will gibt es kein Problem:#include "Parser.h" namespace mrm { Parser::Parser(string _filename) : filename(_filename) { sbmtc::Console logger(std::cout); }}Versuche ich es jedoch in der Datei
Parser.cppz.B. soclass Parser { private: const string filename; sbmtc::Console logger;bekomme ich Fehlermeldungen.
./mrm/Parser.h:24:2: Fehler: »sbmtc« bezeichnet keinen TypIch habe es auch schon mit
using namspace sbmtc;oderusing sbmtc::Console;versucht.sbmtcwird nicht als namespace erkannt. Ich hab die Code-Beispiele etwas verkürzt und vereinfacht. Fehlen noch Informationen?Woran kann das liegen?
-
Zeig mal den gesamten Inhalt des Parser.cpp Files in der Variante die Probleme macht, plus den Inhalt des Parser.hpp Files, sowie aller anderen Files die von Parser.cpp inkludiert werden.
Ohne das können wir nur raten.
Dass du versuchst in Parser.cpp die Klasse Parser zu deklarieren ist ein Indiz für Planlosigkeit und damit die indirekte Ursache des Fehlers, hilft (zumindest mir) aber nicht auf die direkte Ursache zu schliessen.
-
#ifndef PARSER_H_ #define PARSER_H_ #include <string> #include <iostream> #include "sbmtc/smtparser.hpp" using namespace std; namespace mrm { class Parser { private: const string filename; sbmtc::Console logger; public: Parser(string _filename); }; } /* namespace mrm */ #endif /* PARSER_H_ */#include "Parser.h" namespace mrm { Parser::Parser(string _filename) : filename(_filename) {} }Die Fehlermeldung in dem Fall ist
./mrm/Parser.h:24:2: Fehler: »sbmtc« bezeichnet keinen Typhustbaer schrieb:
Dass du versuchst in Parser.cpp die Klasse Parser zu deklarieren ist ein Indiz für Planlosigkeit und damit die indirekte Ursache des Fehlers, hilft (zumindest mir) aber nicht auf die direkte Ursache zu schliessen.
Ich verstehe nicht ganz was du damit meinst. Dass ich eine Klasse im Konstruktor deklariert habe war nur ein Test, der merkwürdigerweise funktioniert. Ich hätte gerne eine Instanz von
Consoleals Element inParser.
-
Und was steht in smtparser.hpp?
-
Ich tippe mal auf rekursive #includes.
Man beachte, zu welcher Datei die fehlerhafte Zeile gehört...
Die Klasse dann nochmal in der .cpp zu defineren wird nat. schiefgehen, aber soweit kommt der Compiler hier gar nicht erst.
-
hustbaer schrieb:
Und was steht in smtparser.hpp?
Es ist eine lange Datei. Ich kürze die etwas ab und hoffe die richtigen Sachen zu erwischen:
#ifndef __PARSER__HPP__ #define __PARSER__HPP__ #include <string> ... #include "logging.hpp" ... namespace sbmtc { ... } #endifConsoleist inlogging.hpp#ifndef __logging_hpp__ #define __logging_hpp__ #include <iostream> ... namespace sbmtc { class Console: public BMCLoggingMessages, public ParserLoggingMessages { public: ... } } // end namespace sbmtc #endifcamper schrieb:
Die Klasse dann nochmal in der .cpp zu defineren wird nat. schiefgehen, aber soweit kommt der Compiler hier gar nicht erst.
An welcher Stelle?
-
-
camper schrieb:
Ich tippe mal auf rekursive #includes.
Und ich tippe du wirst damit wohl Recht haben

Vermutlich steht in irgendeinem sbmtc Header-File ein
#include <parser.h>wo ein#include <sbmtc/parser.h>oder#include "parser.h"stehen sollte.