static char* fälschlicherweise als int* interpretiert



  • Hi!
    Verwende Visual Studio 2005. In meinem Programm hat bis jetzt alles gut funktioniert.

    Hab die Vorgabe, in einer neuen Klasse (ColorSpaces) eine static Memberfunktion zu erzeugen, die einen Buffer von der Klasse (MSImage) erhält, diesen manipuliert und zurückgibt.

    In der Klasse ColorSpaces habe ich zb folgende Funktion:

    static char* calculateLab(MSImage* image);
    

    Übergabe sieht folgendermaßen aus:

    MSImage msimage;
    ColorSpaces::calculateLab(&msimage); // (*
    

    (* warum wird calculateLab als

    int* ColorSpaces::calculateLab(void)
    

    interpretiert und nicht wie die Definition der Memberfunktion?

    Und warum bekomm ich folgende Fehlermeldung:

    error LNK2001: 
    unresolved external symbol "public: static char * __cdecl ColorSpaces::calculateLab(class MSImage *)" 
    (?calculateLab@ColorSpaces@@SAPADPAVMSImage@@@Z)
    

    Headers sind inkludiert, Libraries sind eingebunden.
    Wär super, wenn mir jemand weiterhelfen könnte.

    Danke!
    Adamn



  • ich glaub du musst noch etwas mehr code zeigen. Was meinst du mit als int* ... interpretiert? Kompilierfehler gibts ja so weit ich seh nciht.

    Zeit mal deine Klasse, also definition mit der deklaration der methode, andere kann man ja aussparen. Und zeige genau den Aufruf mit umgebendem code und dann zeig noch die ersten und letzten paar zeilen von CalculateLab



  • Du hast die Definition der Funktion vergessen oder falsch gemacht.
    Das muss in der .cpp Datei stehen.

    char* ColorSpaces::calculateLab(MSImage* image)
    {
    //meine definition
    return 0;
    }
    


  • templäd schrieb:

    Du hast die Definition der Funktion vergessen oder falsch gemacht.
    Das muss in der .cpp Datei stehen.

    char* ColorSpaces::calculateLab(MSImage* image)
    {
    //meine definition
    return 0;
    }
    

    Genau das steht dort drinnen. Das Problem besteht jedoch immer noch!

    Klasse ColorSpaces sieht so aus:

    class ColorSpaces
    {
    public:
    	ColorSpaces();
    	virtual ~ColorSpaces(void);
    
    	// returns a buffer, where the L,a,b values of a given MSImage are stored
    	static char* calculateLab(MSImage* image);
    	static char* calculateLuv(MSImage* image);
    	static char* calculateRG(MSImage* image);
    
    };
    

    In ColorSpaces.cpp passiert noch nicht viel:

    ColorSpaces::ColorSpaces()
    {
    }
    
    // ----------------------------------------------------------------------------
    ColorSpaces::~ColorSpaces(void)
    {
    }
    
    char* ColorSpaces::calculateLab(MSImage* image)
    {
    //	cout << image->data3D << endl;
    }
    
    char* ColorSpaces::calculateLuv(MSImage* image)
    {
    
    }
    
    char* ColorSpaces::calculateRG(MSImage* image)
    {
    
    }
    

    Maxi schrieb:

    Was meinst du mit als int* ... interpretiert?

    In Visual Studio gibts die nette Funktion, wenn man über zb eine Funktion anfokusiert, wird dessen Signatur gezeigt. Wenn ich zb. in main() schreibe:

    ColorSpaces::calculateLab(&msimage);
    

    und über calculateLab fahre, dann steht

    int* ColorSpaces::calculateLab(void)
    

    und nicht

    char* ColorSpaces::calculateLuv(MSImage* image)
    

    In main wird aufgerufen:

    MSImage msimage(str,false);
    	// adamn: ascii false, colorspace RGB
    
    	ColorSpaces::calculateLab(&msimage);
    

    File ist hier einfach der Filename und false eine lesespezifische Eigenheit, umd das File auslesen zu können. MSImage speichert die Bilddaten dann in

    unsigned char*** data3D;
    

    Den ganzen Code zu posten wär einfach zuviel und unübersichtlich. Ich hab gelesen, dass static members nicht nur definiert, sondern auch deklariert werden müssen, um den Compiler zu beruhigen. Compiler meint dann nur: member function redeclaration not allowed.



  • ja, static member müssen noch instanziert werden, static functions nicht.

    Das das visual studio das so anzeigt is sicher einer der vielen bugs im VS. Aber kompilieren tut er ja, oder? Nur der Linker spinnt?

    Hast du die Datei zum Projekt hinzugefügt?



  • Maxi schrieb:

    ja, static member müssen noch instanziert werden, static functions nicht.

    Das das visual studio das so anzeigt is sicher einer der vielen bugs im VS. Aber kompilieren tut er ja, oder? Nur der Linker spinnt?

    Hast du die Datei zum Projekt hinzugefügt?

    Die Rätsels Lösung:

    class [b]__declspec(dllexport)[/b] ColorSpaces
    

    in der ColorSpaces.h ergänzen 😉


Anmelden zum Antworten