namespace problem



  • Das ist nicht der Code, der den Fehler erzeugt hat. Du zeigst hier setValue-Templates, die Fehler beziehen sich auf getValue, litenWerteIt, listenWerte.

    Bei Templates ists übrigens genau andersrum, die musst du komplett im Header definieren, das geht auch ohne inline, da bei Templates die ODR nicht greift.



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


Anmelden zum Antworten