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 Parser nutzen:

    Parser.hpp

    ...
    #include "sbmtc/smtparser.hpp"
    
    using namespace std;
    
    namespace mrm {
    
    class Parser {
    private:
    	const string filename;
    
    public:
    	Parser(string _filename);
    };
    

    sbmtc ist 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 ebenfalls sbmtc heiß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.cpp z.B. so

    class Parser {
    private:
    	const string filename;
    	sbmtc::Console logger;
    

    bekomme ich Fehlermeldungen.

    ./mrm/Parser.h:24:2: Fehler: »sbmtc« bezeichnet keinen Typ
    

    Ich habe es auch schon mit using namspace sbmtc; oder using sbmtc::Console; versucht. sbmtc wird 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 Typ
    

    hustbaer 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 Console als Element in Parser .



  • Und was steht in smtparser.hpp?


  • Mod

    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 {
    ...
    }
    #endif
    

    Console ist in logging.hpp

    #ifndef __logging_hpp__
    #define __logging_hpp__
    
    #include <iostream>
    ...
    
    namespace sbmtc {
      class Console: public BMCLoggingMessages, public ParserLoggingMessages {
      public:
      ...
      }
    
    } // end namespace sbmtc
    
    #endif
    

    camper 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?


  • Mod



  • 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.


Anmelden zum Antworten