vector<Foo*> als Parameter für vector<const Foo*> übergeben



  • Hallo zusammen,

    Ich hab einen std::vector mit Zeigern drin...
    Zudem eine Funktion, die eine Referen auf einen vector mit const Zeigern
    erwartet.

    Warum kann ich den Vektor nicht übergeben, immerhin hab ich ja sogar mehr Rechte?
    Wie krieg ich das hin?

    Beispiel-Code:

    main.cpp:

    #include <vector>
    #include "Foo.h"
    
    int main(void){
    	std::vector<Foo*> foos;
    	Foo::method(foos);
        return 1;
    }
    

    Foo.h:

    #include <vector>
    
    class Foo {
    public:
    	static void method(std::vector<const Foo*>& o);
    };
    

    Foo.cpp:

    #include "Foo.h"
    
    void Foo::method(std::vector<const Foo*>& o){
    }
    

    Gruß,
    CSpille



  • Foo::method((vector<const Foo*>&)foos);
    

    🙂



  • Oh shit...

    Nen einfacher cast reicht 🙄
    *Versink im Erdboden*

    Danke!



  • CSpille schrieb:

    Oh shit...

    Nen einfacher cast reicht

    Reicht um undefiniertes Verhalten herbeizuführen. Für mehr aber auch nicht. std::vector<T*> und std::vector<const T*> sind zwei unverwandte Typen und der Zugriff auf ein Objekt des einen Typs über eine Referenz vom anderen Typ ist illegal.

    Nur mal so als Beispiel:

    template <class T>
    class Vector {
    public:
      void f() const {
        cout << "Alles fein!" << endl;
      }
    };
    
    template <class T>
    class Vector<const T*> {
    public:
      void f() const {
        cout << "Ding-Dong, die Hex ist tot!"  << endl;
      }
    };
    
    void f(const Vector<const int*>& v) {
      v.f();
    }
    
    int main() {
      Vector<int*> v;
      v.f();
      f((const Vector<const int*>&)v);
    }
    

    Entweder du änderst die Sigantur deiner Funktion oder du steigst auf einen vector<const Foo*> um.


Anmelden zum Antworten