std::string in meinem namespace



  • Hallo!

    Ich habe folgenden Code:

    //Util.cpp
    #include "car/Util.h"
    #include "car/Transformation.h"
    
    #include "tinyxml.h"
    
    #include <stdexcept>
    #include <cstdarg>
    #include <cassert>
    #include <ctime>
    #include <iostream>
    #include <iomanip>
    #include <sstream>
    
    namespace car {
    
    const std::string VERSION = "0.1.0"; // Hier meckert VS
    ...
    

    In der letzten Zeile gibt mir VS die Fehlermeldung:

    Error: namespace "car::std" has no member "string"

    Wieso denkt er string ist in meinem namespace? Wie schaffe ich es, dass VERSION in meinem car namespace ist und ich string benutzen kann? ūüėē


  • Mod

    Du hast offenbar einen verschachtelten Namensraum in car definiert, der ebenfalls std heißt.

    Das ist eine dumme Idee und sollte geändert werden - eine vorläufige Lösung ist jedoch recht einfach:

    const ::std::string VERSION = "0.1.0";
    


  • #include <string>



  • Arcoth schrieb:

    Du hast offenbar einen verschachtelten Namensraum in car definiert, der ebenfalls std heißt.

    Das ist eine dumme Idee und sollte geändert werden - eine vorläufige Lösung ist jedoch recht einfach:

    const ::std::string VERSION = "0.1.0";
    

    Danke schon mal f√ľr den Hinweis.

    Ich habe gerade meinen kompletten Code durchsucht und ein "namespace std { .." habe ich nirgends, allerdings habe ich folgendes:

    namespace car {
    
    using namespace std;
    ...
    

    Kann das der Grund sein?



  • Argh!

    Habs gefunden... Hatte in einem Header einen nicht schließenden Namespace...

    Eine Frage noch: Wenn ich meinem Namespace eine Variable anlege. Woher weiß der dann wie der exakte Typ lautet? Beispiel:

    namespace car {
       std::string foo;
    }
    

    Woher weiß der Compiler jetzt, dass ich std::string meine und nicht car::std::string?



  • axa schrieb:

    Woher weiß der Compiler jetzt, dass ich std::string meine und nicht car::std::string?

    Ganz einfach: Es gibt keinen Namespace std innerhalb von car. Der Compiler sucht von innen nach außen. Im folgenden Beispiel habe ich die Scopes mal in der Reihenfolge nummeriert, in der sie gesucht werden*:

    #include <iostream>
    
    namespace foo // 3
    {
    	void func() {std::cout << "foo\n";}
    }
    
    namespace ns
    {
    	namespace foo // 2
    	{
    		void func() {std::cout << "ns::foo\n";}
    	}
    
    	struct bar
    	{
    		struct foo // 1
    		{
    			static void func() {std::cout << "ns::bar::foo\n";}
    		};
    
    		void func()
    		{
    			foo::func();
    		}
    	};
    }
    
    int main()
    {
    	ns::bar b;
    	b.func();
    }
    

    *Zu beachten ist, dass der Compiler stoppt, sobald er einen passenden Scope gefunden hat. Gibt es die Klasse foo, hat diese jedoch keine Funktion func, ist das ein Fehler. Es wird dann nicht weitergesucht.


Log in to reply