namespace problem



  • Sorry ich dachte das die keine Rolle spielt. Also nochmal

    //ist di namesp.h
    namespace bla{
    std::list<std::string> liste
    std::list<std::string>::iterator listIt
    template<typename T>
    void setValue(double t, int i, T wert);
    std::string getValue();
    }
    //namesp.cpp
    template<typename T>
    void bla::setValue(double t, int i, T wert)
    {
    std::stringstream ss;
    ss<<t<<"\n"<<i<<"\n"<<wert<<"\n";
    liste.push_front(ss.str());
    }
    
    std::string bla::dataPool::getValue(){
    	listIt = listenWerte.begin();
    	std::string wert = *listIt;
    	return wert;
    }
    

    listenWerte entspricht liste, listenWerteIt entspricht listIt



  • - getValue hat genau das Problem, was ich oben beschrieben habe.
    - liste und listIt sind mit Sicherheit nicht so definiert, sonst würde es nichtmal durch den Compiler gehen.
    - listenWerteIt, listenWerte sind vermutlich ähnlich wie getValue normale Funktionen udn haben auch das selbe Problem.

    Warum zeigst du nicht per Copy&Paste den wirklichen Code, den du hast? (Natürlich aufs Wesentliche reduziert)



  • Pumuckl hat recht. Da fehlen zwei Semikoli im Header (richtige Plural ?).
    Und Einrücken wär nicht schlecht.



  • //dataPool.h
    namespace dataPool{
    std::list<std::string> listenWerte;
    std::list<std::string>::iterator listenWerteIt;
    template<typename T>
    void setValue(double t, int i, T wert);
    std::string getValue();
    }
    //dataPool.cpp
    template<typename T>
    void dataPool::setValue(double t, int i, T wert)
    {
    std::stringstream ss;
    ss<<t<<"\n"<<i<<"\n"<<wert<<"\n";
    listenWerte.push_front(ss.str());
    }
    
    std::string dataPool::getValue(){
        listenWerteIt = listenWerte.begin();
        std::string wert = *listenWerteIt;
        return wert;
    }
    

    Das ist der vollständige Code mehr habe ich auch nicht. Ich habe die Sachen genauso wie oben.



  • Ich habe lediglich in module1

    #include "dataPool.h"
    

    und in Target auch

    #include "dataPool.h"
    


  • Und wie stehen die Beide in Verbindung ?
    Du musst schon konkreter werden.



  • Die beiden haben im Prinzip keine Beziehung zueinander. Wie ich schon erwähnt habe, soll mir die namespace als eine Art Zwischenspeicher für alle Objekte dienen.



  • Beobachter01 schrieb:

    Das ist der vollständige Code mehr habe ich auch nicht. Ich habe die Sachen genauso wie oben.

    Warum nicht gleich.

    Also:

    1. getValue() hatte das beschriebene Problem, das dürfte jetzt nichtmehr auftreten.
    2. listenWerte und litenWerteIt haben das selbe Problem, nur dass es eben Variablen sind. Die gehören so oder so nicht im header definiert (höchstens deklariert), am Besten garkeine globalen/namespace scope variablen.
    3. setValue hat das Problem, dass die Template-Definition im Header stehen muss.

    alles zusammen sieht mir danach aus, als ob du das Ganze in eine Klasse packen und ein Singleton oder was ähnliches draus machen solltest.



  • Beobachter01 schrieb:

    Die beiden haben im Prinzip keine Beziehung zueinander. Wie ich schon erwähnt habe, soll mir die namespace als eine Art Zwischenspeicher für alle Objekte dienen.

    1. der namespace (Namensraum)
    2. Ein namespace ist kein Objekt, sondern nur ein Mittel zur Code-Organisation. Du kannst in einem namespace nichts speichern.


  • Soll ich alles in eine Klasse packen und die einzelnen Methoden bzw. Liste auch als static definieren?

    Das Ziel soll sein, dass alle Objekte (andere Klassen) in die Liste etwas einfügen und auch entfernen können sollen.



  • Beobachter01 schrieb:

    Soll ich alles in eine Klasse packen und die einzelnen Methoden bzw. Liste auch als static definieren?

    Wäre eine Möglichkeit. Den Iterator brauchst du sowieso nicht dauerhaft halten, der reicht funktionslokal völlig aus.



  • Stimmt ich könnte den Iterator immer wieder lokal anlegen. Danke dir!
    Falls noch Fragen auftauchen sollte komme ich nochmal vorbei 🙂



  • Hi nochmals,

    ich bekomme jetzt so einen Fehler:

    error c2011: 'dataPool' : 'class' type redefinition -> see declaration of dataPool
    

    Ich könnte .....! Namespace wurde als eine statische Klasse mit statischen variabeln und Methoden implementiert. Ich habe versucht die Header-Datei wieder in 2 verschiedenen Klassen eingebunden. Wie bekomme ich das hin, dass nur einmal die Klasse definiert wird und alle Zugriff darauf haben?


  • Mod

    Das klingt so, als hättest du keine Include Guards (mal nach googlen, wenn dir das nichts sagt).



  • falls ich IncludeGuards hinzufüge bekomme ich einen Linker-fehler der mir sagt, dass er auf die statische methode von dataPool nicht zugreifen kann. Wie kann ich dies beheben. Ich wollte eine statische Klasse bereitstellen auf der alle anderen zugreifen können. Werte löschen, ändern hinzufügen usw...


  • Mod

    Beobachter01 schrieb:

    falls ich IncludeGuards hinzufüge bekomme ich einen Linker-fehler der mir sagt, dass er auf die statische methode von dataPool nicht zugreifen kann. Wie kann ich dies beheben. Ich wollte eine statische Klasse bereitstellen auf der alle anderen zugreifen können. Werte löschen, ändern hinzufügen usw...

    Sag mal den genauen Fehler an. Und (hoffentlich) dumme Frage: Die Methode existiert auch irgendwo, oder?



  • 😃 klar existiert die Methode

    module1.obj : error LNK2019: unresolved external symbol "public: static void __cdecl dataPool::setValue<double>(double,int,double)" (??$setValue@N@dataPool@@SAXNHN@Z) referenced in function "public: void __thiscall module1::run(void)" (?run@module1@@QAEXXZ)
    

    Das ist dazugehörige Klasse:

    //dataPool.h
    class dataPool{
    private:
        static std::list<std::string> listenWerte;
    public:
        template<typename T>
        static void setValue(double t, int i, T wert);
        static std::string getValue();
    }
    //dataPool.cpp
    std::list<std::string> dataPool::listenWerte
    
    template<typename T>
    void dataPool::setValue(double t, int i, T wert)
    {
        std::stringstream ss;
        ss<<t<<"\n"<<i<<"\n"<<wert<<"\n";
        listenWerte.push_front(ss.str());
    }
    
    std::string dataPool::getValue(){
        std::list<std::string>::iterator listenWerteIt;
        listenWerteIt = listenWerte.begin();
        std::string wert = *listenWerteIt;
        return wert;
    }
    


  • Die Methode existiert auf jeden Fall nicht dort, wo sie benötigt wird. Aber das Problem mit Templates und getrennten Übersetzungseinheiten wurde hier auch schon mehrfach erwähnt.



  • Hacker schrieb:

    Semikoli im Header (richtige Plural ?).

    Ich glaube es heißt "Semikola".



  • Lieber Beobachter01. Langsam aber sicher kommt echt Spannung auf meine Hutschnur, soll heißen, kurz vorm reißen. Du möchtest, dass wir dir bei deinen Problemen helfen, gut. Dazu ist das Forum da. Aber wenn du nicht möchtest, dass dich die Leute irgendwann als Troll abstempeln und aufhören, dir zu helfen, dann gib dir bitte ein bisschen Mühe. Zum Einen habe ich dir mehrfach geschrieben, dass du Templates komplett im Header definieren musst. Du warst scheinbar zu faul, das umzusetzen oder hast nicht aufmerksam gelesen, jetzt hast du den Salat. Zum Anderen hatten wir schon beim ersten Problem das Thema mit der vollständigen Fehlermeldung und dem passenden Code. Bei diesem neuen Problem musste dir das wieder mühsam Stück für Stück aus der Nase gezogen werden. Warum? Lies dir bitte den Link in meiner Signatur aufmerksam durch, und dann viel Erfolg bei neuen Fragen, die hoffentlich gleich beantwortbar sind und nicht stundenlanges hin und her benötigen.


Anmelden zum Antworten