Kann FU* nicht in assigment nach FU* convertieren



  • Hi,

    steh gerade irgendwie bisschen auf dem schlauch.
    Folgendes :

    vec<FU * >v;
    v[0]=new FU;           /// Das geht nicht
    
    template<typename  T>
    class vec
    {
    
    ....
    public:
    explicit vec(){data=new T[...]; }
    T *data;
    
    ...
    T &operator[](size_t s )
    {
        ///prüfen
        return data[s];
    }
    };
    

    Ich bekomme die Fehlermeldung:
    FU*« kann nicht nach »FU*« in assignment umgewandelt werden


  • Mod

    Gib mal Copy&Paste Code der bis auf den besagten Fehler compilierbar ist, damit man deine Zahlreichen Abschreibfehler ausschließen kann.



  • Hi SeppJ,

    du sorry, aber das ist nicht wenig und auch noch nicht so vollständig wie ich
    das ganze am Schluss haben mag.

    Das new ist ... ich wollt zeigen, dass es da is. Wußt ich aber schon beim Tippen.

    Muss ich denn für FU den zuweisungsoperator überschreiben ??
    Aber eigentlich kopiere ich ja nur den pointer ???....

    EDIT: Hoffe du hilfst trotzdem, oder gibst einen Schetzer ab ..


  • Mod

    template<typename  T>
    class vec
    {
    
    public:
      explicit vec(){data=new T[1]; }
      T *data;
    
      T &operator[](int s )
      {
        return data[s];
      }
    }; 
    
    struct FU{};
    
    int main()
    {
      vec<FU*>v;
      v[0]=new FU;   // Das geht
    }
    

    Und nun?

    Lautet die Fehlermeldung wirklich genau so? Und ist der gezeigte Code auch wirklich 100% äquivalent zum richtigen Code? (Tipp: Mindestens die zweite Frage hat offensichtlich ein Nein zur Antwort)

    So eine Fehlermeldung, dass ein Typ nicht in sich selbst umgewandelt werden kann, deutet oftmal da drauf hin, dass da entweder irgendwas mit Arrays falsch gemacht wird oder mit const.


  • Mod

    AlexanderKiebler schrieb:

    du sorry, aber das ist nicht wenig und auch noch nicht so vollständig wie ich
    das ganze am Schluss haben mag.

    Und nun noch ein Crashkurs: Erstellen minimaler Beispiele

    Wenn bei einem dieser Schritte der Fehler irgendwann nicht mehr auftritt (bei jedem Zwischenschritt prüfen!), dann ist das ein heißer Hinweis auf die Fehlerquelle und du solltest dir das mal näher anschauen (mach aber nach Möglichkeit trotzdem mit den anderen Schritten weiter):
    1. Kopier deinen Code irgendwohin.
    2. Streich alles raus, außer den Klassen vec und FU und den aufrufenden Code
    3. Streich den aufrufenden Code zusammen, bis nur noch die Deklarationen und die Problemzeile da sind (so wie in dem Code den du hier gepostet hast)
    4. Streich die Klasse FU zusammen, bis sie leer ist (so wie in dem Code, den ich hier gepostet habe)
    5. Streich die Klasse vec so zusammen, dass nur noch die Member und Funktionen übrig sind, die für die Problemzeile absolut nötig sind. Es braucht nicht zur Laufzeit zu funktionieren! Es ist hier z.B. total egal, dass data auf etwas auf dem Heap zeigt, entscheidend ist, dass es ein T* ist.
    6. Streich auch noch die beteiligten Memberfunktionen so weit wie moglich zusammen (wie die Kürzung der Prüfung in dem Code den du gepostet hast).

    Da meine leicht korrigierte Version deines Codes funktioniert und dein nicht gezeigter Originalcode aber nicht, ist wohl irgendwann auf dem Weg der Fehler rausgekürzt worden.



  • Okay zweiter Versuch:

    class Bar
    {
            class FU
            {
                public:
                    explicit FU(char const * VersionString,const char * ModuleGroup)
                    {
                        if(!VersionString || !ModuleGroup)
                            return;
    
                        MAJOR[major]=new FUFU(minor,patch,this); /// Er meckert
                    }
                  private:
                    RadixVector<FUFU *> MAJOR;
    
            };
    };
    
    template <typename T>
    class RadixVector
    {
    
        public:
    
            T &operator [](size_t s)
            {
                return  data[s];
            }
    
        private:
            T               *data;
    
    };
    

    Und die Fehlermeldung ist:
    " »Bar::FU*« kann nicht nach »FU*« in assignment umgewandelt werden|
    ||=== Build finished: 1 errors, 0 warnings ===|
    "



  • Okay,
    hab ne Lösung gefunden. Habe den Namensraum entkuddelt....
    dann gehts..



  • Entkuddelt?



  • Okay, das wort gibts wohl so nicht. Es meint aus einem Gewirr was eindeutiges machen. Ich habe früher Wollfäden entkuddelt. 🙂



  • Ich finds schade, dass du immer Code postest, anhand dessen man dein Problem nicht nachvollziehen kann.

    Kopier den (2.) Code mal in eine Datei und kompiliere.
    Du kriegst nicht ansatzweise die Fehlermeldung, die du vorgibst.

    Du gibst zwar später dann an, dass du dein Problem gelöst hast, aber eine Beschreibung, was du dazu gemacht hast, ist vergleichbar mit "Ich habs neu geschrieben"

    Es ist nicht das erste mal, dass ich das von dir hier sehe.

    Sorry, aber so kann (und will) man dir hier (zukünftig) nicht (mehr) helfen... 👎



  • Entschuldigung, das ist keine Absicht gewesen.

    Ich versuche eben immer so weit wie möglich zu kürzen, um es nicht unnötig kompliziert zu machen... Ich neige wohl dazu, das ganze zu weit zu vereinfachen.

    ich werde meine Beispiele in Zukunft zusammengekürtzt nochmal durch den Comiler jagen bevor ich sie schicke.

    Die Lösung in diesem Fall war, dass ich die Klasse FU aus der Klasse Bar rausgenommen habe.



  • AlexanderKiebler schrieb:

    Die Lösung in diesem Fall war, dass ich die Klasse FU aus der Klasse Bar rausgenommen habe.

    Auch wenn ich eigentlich selten innere Klassen verwende, kann das (glaub ich) eigentlich nicht der Grund sein, da du sie nur in deiner äußeren Klasse verwendet hast.

    EDIT: Aber sei jetzt auch mal dahingestellt. Lern bitte etwas fürs nächste mal draus 😉



  • Ja du hast ja Recht,

    es war gestern Abend noch spät und ich habe im Halbschlaf bemerkt,
    dass ich einen Konstuktor aufrufe, ohne ihn definiert zu haben.
    Also Vorwärtsdekleration, dann Konstuktoraufruf, und dann erst Prototyp und implementierung.
    Das nur um deine Vermutung zu bestätigen...

    Ich habe mir gleich danach schlafen gelegt, und das ist dann ein bischen untergegangen =)....



  • AlexanderKiebler schrieb:

    Ich werde meine Beispiele in Zukunft zusammengekürtzt nochmal durch den Comiler jagen bevor ich sie schicke.

    Ja, bitte tu das!



  • Immer auf die kleinen Dicken =)...
    Ich bin generell unschuldig, wie deine Licht-tools 🙂


Anmelden zum Antworten