Mehrdeutiges Symbol



  • Hallo

    Bin ein kleines Programm am schreiben, und bekomme immer folgende Fehlermeldung:

    \stringtest\string.cpp(10) : error C2872: 'string': Mehrdeutiges Symbol

    string::string(char x)
    { 
    	string::a =x;	
    
    	}
    

    Kennt jemand den Fehler?



  • schaut danach aus als ob du 2 klassen mit dem namen "string" im selben namespace hast.



  • Vll. weil dein Funktion selbst auch "string" heißt?
    MfG
    Stromberg



  • hier mal alles soweit wie ich das gemacht hab

    //String.cpp %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    #include "String.h"
    #include "stringtest.h"
    
    string::string(char x)
    { 
    	string::a =x;	
    
    	}
    
    //String.h     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    #if !defined(STRING_H_INCLUDED_)
    #define STRING_H_INCLUDED_
    
    #include <iostream>
    using namespace std;
    
    class string 
    {
    public:
    	string (char x);
    
    private:
    
    	char a;
    };
    #endif
    
    //stringtest.h           %%%%%%%%%%%%%%%%%%%%
    
    // stringtest.h: Master include File 
    
    #ifndef STRINGTEST_H_INCLUDED_
    #define STRINGTEST_H_INCLUDED_
    
    #include <iostream>
    #include "String.h"
    using namespace std;
    
    #endif // define STRINGTEST_H_INCLUDED_
    
    //Stringtest.cpp %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    #include "stringtest.h"
    
    int main()
    {
    cout << 'H';
    return 0;
    }
    


  • so sollte das klappen.

    string.h

    #pragma once
    class string
    {
    public:
     string(char x);
    
    private:
     char a;
    };
    

    string.cpp

    #include "string.h"
    
    string::string(char x) :
     a(x)
    { }
    

    main.cpp

    #include "string.h"
    //include <string> //std::string -> gleicher name wie string aus string.h
    //using namespace std // fusioniert namespace std mit namespace global, potentielle mehrfache symbole mit deiner namesgebung.
    
    int main(int, char**)
    {
     string str('a');
    
     return 0;
    }
    


  • ich bin immer dafür, eigene klassen nicht wie eingabaute typen oder klassen zu benennen!

    naja...just my 2 cents



  • inp schrieb:

    so sollte das klappen.

    string.h

    #pragma once
    class string
    {
    public:
     string(char x);
    
    private:
     char a;
    };
    

    string.cpp

    #include "string.h"
    
    string::string(char x) :
     a(x)
    { }
    

    main.cpp

    #include "string.h"
    //include <string> //std::string -> gleicher name wie string aus string.h
    //using namespace std // fusioniert namespace std mit namespace global, potentielle mehrfache symbole mit deiner namesgebung.
    
    int main(int, char**)
    {
     string str('a');
    
     return 0;
    }
    

    Danke erstmal
    so funktionierts. Bin zwar noch am grübeln warum und wieseo.....



  • Hallo

    nun will ich den Übergebenen Buchstaben in eine Liste rein schreiben?

    Frage:

    Muss ich hierzu = überladen?? weil:Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'char' akzeptiert (oder keine geeignete Konvertierung möglich)

    string::string(char x)  
    { 
    	struct Buchstabenliste {
    		char buchstabe;
    		Buchstabenliste *next;} b1;
    
    b1=x;
    
     }
    


  • b1.buchstabe=x;

    ich seh schon den wald vor bäumen nicht mehr



  • wenn ich jetzt folgendes machen will

    #include "string.h" 
    #include <iostream>
    
    int main() 
    { 
     string str ='a'; 
     cout << "HALLO" << endl;
    
     return 0;
    

    dann sagt er

    error C2065: 'cout': nichtdeklarierter Bezeichner

    warum das denn??



  • Weil cout seit ca. 10 Jahren im Namensraum std liegt. Benutze entweder std::cout oder... Nein, da Deine Klasse "string" heisst, benutze std::cout.



  • entweder

    ...
    using namespace std;
    ...
    cout << ...;
    ...
    

    aber da wirst du eine nameskollision bekommen (mehrdeutige symbole) 🙂
    wie im vorigen beispiel wg deiner string klasse und der std::string klasse

    oder

    ...
    std::cout << ...;
    ...
    


  • keiner eine ahnung???



  • irgendwie versteh ich das nicht.

    kann mir vll jemand das mit dieser "Namenskollision erklären"



  • kann das sein das es im namespace std auch irgendwas gibt was string heißt??

    d.h. ich sollte meine klasse string1 oder so nennen???



  • WAS funktioniert an std::cout nicht?
    WAS verstehst Du nicht an "wg deiner string klasse und der std::string klasse"?

    Zu string1: Nein, musst Du nicht. Dafür gibt es Namensräume. (Damit und mit etwas nachdenken sollte sich auch der Begriff "Namenskollision" klären)



  • Endlich hat er's...

    namespace std {
    
        class string : public basic_string< ... >; // gibt's schon.
    }
    
    // und dann deine im "globalen" namespace:
    
    class string;
    
    // und dann
    
    using namespace std;
    
    // und dann
    
    string foo; // boooom!
    

    Also: Entweder anderer Name, bei der verwendung "deines" string's kein using namespace std und auf keinen Fall #include <string> oder deinen string in einen anderen Namespace und tierisch aufpassen...

    greetz, Swordfish



  • das std::cou funktioniert.
    Ich weiß nur nicht so richtig warum. und warum ich using namespace std nicht einfügen kann.

    Ich vermute:
    Im namespace std gibt es wohl schon eine klasse die string heißt, und wenn ich std einfüge weiß er nicht welche klasse er verwenden soll ---> namenskollision.

    da ich std dann halt nicht eingefügt habe funktioniert cout auch nicht.

    wenn ich jetzt meine klasse string1 nenne, und std einfüge müsste ich cout verwenden können.

    Ist das so richtig??



  • so, habs versucht.

    funktionieren tut es, wäre noch nett wenn mir jemand sagt ob mein verständnis dafür auch richtig ist



  • physikus schrieb:

    so, habs versucht.

    funktionieren tut es, wäre noch nett wenn mir jemand sagt ob mein verständnis dafür auch richtig ist

    ja hast du



  • guck dir am besten mal irgendwo ne erklärung von namespaces an. die hier z.b.: http://de.wikibooks.org/wiki/C++-Programmierung:_Namensräume

    scheinst es aber grundlegend bereits verstanden zu haben.


Anmelden zum Antworten