Problem Template Klasse abzuleiten



  • Hi,
    irgendwie will folgender Code nicht:

    // image.h:
    #include <vector>
    #include <stdexcept>
    
    template <typename T>
    class Image
    {
    public:
    	Image(BITMAP* bitmap);
    	Image(const std::vector<T> data, long width, long height, long bpp);
    	Image(const Image<T>& image);
    	~Image();
    	const Image& operator=(const Image& image) throw(std::range_error);
    
    	T getAt(long x, long y) const {return m_data[y * m_width + x];}
    	void setAt(long x, long y, T value) {m_data[y * m_width + x] = value;}
    
    	long getWidth() const {return m_width;}
    	long getHeight() const {return m_height;}	
    
    	void display(BITMAP* DestBitmap) throw(std::runtime_error);
    
    private:
    	std::vector<T> m_data;
    	long m_width;
    	long m_height;
    	long m_bpp;
    };
    
    // [Code]
    
    template <typename T>
    class GrayImage : public Image<T>
    {
    public:
    	GrayImage(BITMAP* bitmap);
    	GrayImage(const Image& image) throw(std::range_error);
    	~GrayImage();
    };
    
    template <typename T>
    GrayImage<T>::GrayImage(BITMAP* bitmap) : m_width(bitmap->bmWidth), m_height(bitmap->bmHeight), m_bpp(sizeof(T))
    {
    	// [code]
    }
    
    template <typename T>
    GrayImage<T>::GrayImage(const Image<T>& image) throw(std::range_error) : m_width(image.getWidth()), m_height(image.getHeight), m_bpp(sizeof(T))
    {
    	// [code]
    }
    ////////////////////////////////////////////
    
    // main.cpp:
    bool __stdcall main(BITMAP* Bitmap)
    {
    	Image<unsigned char> SrcImage(Bitmap);
    	GrayImage<unsigned char> GrayImage(SrcImage); // error C2664
    
    	return true;
    }
    

    error C2664: '__thiscall GrayImage<unsigned char>::GrayImage<unsigned char>(struct tagBITMAP *)' : Konvertierung des Parameters 1 von 'class Image<unsigned char>' in 'struct tagBITMAP *' nicht moeglich



  • Das steht doch da: er kann den Parameter SrcImage, der vom Typ Image<unsigned char> ist nicht in ein BITMAP* umwandeln. Weiter helfen kann ich Dir leider nicht, weil ich nicht weiß was Du genau erreichen möchtest.

    MfG Jester



  • das Problem liegt meiner Meinung nach hier:

    GrayImage(const Image& image) throw(std::range_error);
    

    muss dort nicht ein

    GrayImage(const Image<T>& image) throw(std::range_error);
    

    stehen??



  • Im Prinzip möchte ich einfach nur Bilder verwalten.
    Die Bilder bekomme ich über eine BITMAP Struktur, diese soll an eine Klasse Image übergeben werden. Diese Klasse wird anschließend mit den Daten aus der BITMAP Struktur gefüllt.

    Das klappt bis dahin auch alles wunderbar.

    Als nächsten Schritt wollte ich nun eine neue Klasse für Graustufenbilder einführen, da dort die Daten etwas anders gespeichert werden.
    (Je mehr ich darüber nachdenke, könnte man statt einer neuen Klasse GrayImage, vielleicht auch einfach eine Memberfunktion GenerateGrayImage() in Image einfügen, die die Daten umwandelt...)

    Soweit der Plan, allerdings scheitere ich weiterhin an der Umsetzung:

    Mich stört, dass die Fehlermeldung nicht so recht mit dem zusammenhängt, was eigentlich gemacht werden soll.

    Hier übergebe ich eine Image Klasse an den Konstruktor der abgeleiteten Klasse GrayImage:

    GrayImage<unsigned char> GrayImage(SrcImage);
    

    In der Fehlermeldung ist aber die Rede von "kann nicht in 'struct tagBITMAP' konvertieren", doch ich rufe diesen Konstruktor garnicht auf...

    Ein anderes Problem:

    GrayImage<unsigned char> GrayImage(Bitmap);
    

    Hier übergebe ich einen Zeiger auf eine BITMAP Struktur, nun bekomme ich eine Fehlermeldung, dass kein entsprechender Standardkonstruktor definiert ist.

    Ich nehme also folgende Änderung vor:

    // VON:
    template <typename T>
    GrayImage<T>::GrayImage(BITMAP* bitmap) : m_width(bitmap->bmWidth), m_height(bitmap->bmHeight), m_bpp(sizeof(T))
    {
        // [code]
    }
    
    // IN:
    template <typename T>
    GrayImage<T>::GrayImage(BITMAP* bitmap) : Image(bitmap)
    {
        long test = m_width; // Error
        // [code]
    }
    

    Nun bekomme ich eine Fehlermeldung, dass ich nicht auf die Membervariablen zugreifen kann, da sie private sind und ich gefälligst die entsprechenden get-Memberfunktionen benutzen soll, allerdings ist gar kein Objekt von der Klasse Image im Konstruktor von GrayImage vorhanden, so dass ich kein Zugriff darauf habe.



  • Nun bekomme ich eine Fehlermeldung, dass ich nicht auf die Membervariablen zugreifen kann, da sie private sind und ich gefälligst die entsprechenden get-Memberfunktionen benutzen soll, allerdings ist gar kein Objekt von der Klasse Image im Konstruktor von GrayImage vorhanden, so dass ich kein Zugriff darauf habe.

    was soll denn das?? natürlich sind die nicht überladenen member von Image in deiner Klasse vorhanden, du hast ja den Konstruktor von Image (der ja vor dem Konstruktur abgeleiteter klassen, hier GrayImage, aufgerufen wird) sogar in deiner Initialisiererliste stehen. Und dass das GrayImage nicht auf m_width usw. zugreifen kann ist klar, du hast es ja in der basisklasse als private deklariert... wenn du willst, dass abgeleitete klassen darauf zugreifen können, außendstehende funktionen aber nicht, musst du m_width, m_bpp usw. in die protected section verschieben:

    ...
    protected:
        std::vector<T> m_data;
        long m_width;
        long m_height;
        long m_bpp;
    


  • @todo: http://www.gotw.ca/gotw/070.htm (warum man keine protected Daten haben sollte).

    Aber um Zugriff zu bekommen könnte man zum Beispiel in der Basisklasse protected-Funktionen einrichten, die Zugriff bieten.

    MfG Jester


Anmelden zum Antworten