Mehrdeutiger Aufruf eine Überladenen Funktion ?



  • Hi,

    Ich bin mal wieder , ich folgendes Problem:

    Ich habe in einer Klasse mehere KOnstructoren. Und wenn ich einen Konstructor verwende kommt genau die Fehlermeldung:

    **error C2668: 'nXColor::nXColor' : Mehrdeutiger Aufruf einer ueberladenen Funktion
    **

    Woran kann das liegen ?

    _h_
    
    class nXColor
    {
    public:
    	nXColor();
    	nXColor( FLOAT a, FLOAT r, FLOAT g, FLOAT b );
    	nXColor( UCHAR a, UCHAR r, UCHAR g, UCHAR b );
    ...
    
    _cpp_
    
    ////////////////////////////////////////////////////////////////////
    // PUBLIC nXColor
    //
    // constructor
    ////////////////////////////////////////////////////////////////////
    nXColor::nXColor( FLOAT a, FLOAT r, FLOAT g, FLOAT b )
    {
    	this->a = (UCHAR)(a*255);
    	this->r = (UCHAR)(r*255);
    	this->g = (UCHAR)(g*255);
    	this->b = (UCHAR)(b*255);
    }
    
    ////////////////////////////////////////////////////////////////////
    // PUBLIC nXColor
    //
    // constructor
    ////////////////////////////////////////////////////////////////////
    nXColor::nXColor( UCHAR a, UCHAR r, UCHAR g, UCHAR b )
    {
    	this->a = a;
    	this->r = r;
    	this->g = g;
    	this->b = b;
    }
    

    Kann mir da jemand helfen ?

    Cu



  • die implementation der konstruktoren ist uninteressant. interessant ist die signatur und der aufruf.

    edit: und kuck dir mal initialisierungslisten an.



  • Aufruf:

    nXColor cl = nXColor( 0, 255, 0, 255 );
    


  • AChja, folgendes funtzt:

    nXColor cl = nXColor( 0.0f, 1.0f, 0.0f, 1.0f );
    

    Bye



  • Hallo,
    dein Aufruf:
    nXColor cl = nXColor( 0, 255, 0, 255 );

    hätte als bestes Ergebnis ein nXColor( int, int, int, int );

    Du hast aber nur:

    // a)
    nXColor( FLOAT a, FLOAT r, FLOAT g, FLOAT b ); 
    // b)
    nXColor( UCHAR a, UCHAR r, UCHAR g, UCHAR b );
    

    Gehen wir es durch:
    a) 4x int -> float = 4x Floating-Integral Conversion.
    b) 4x int -> uchar = 4x Integral Conversion

    Beides sind also Conversions und beide haben den selben Rang bei der Überladungsauflösung. Die beiden Konstruktoren passen also gleich gut zu dem Aufruf. Und in einem solchen Fall ist ein Aufruf immer mehrdeutig, da der Compiler weder Münzen zum werfen hat, noch deine Gedanken lesen kann.



  • Hi,

    Jo, hab ich auch gedacht 😉 .

    So wie kann ich dann das beheben, UCHAR muss stehen bleiben ?

    Cu



  • So wie kann ich dann das beheben, UCHAR muss stehen bleiben ?

    nXColor cl = nXColor( UCHAR(0), UCHAR(255), UCHAR(0), UCHAR(255) );

    Es reicht natürlich auch ein UCHAR. So ist's aber verständlicher.



  • Hi,

    Also ich versteh jetzt gar nix mehr !!!!!!!
    Erstmal Danke an alle!!

    Genau den gleichen Code hab ich ausgeführt und es ging nicht. Und plötzlich geht er. 🙄
    Puh .. Windows sag ich da nur.

    Ok Danke nochmal!

    Bye



  • HumeSikkins schrieb:

    So wie kann ich dann das beheben, UCHAR muss stehen bleiben ?

    nXColor cl = nXColor( UCHAR(0), UCHAR(255), UCHAR(0), UCHAR(255) );

    ...

    Sieht IMHO sehr unschoen aus und man sollte sich vielleicht ueberlegen ob man denn wirklich
    die beiden Konstruktoren, so wie sie sind, benoetigt oder ob man das irgendwie anders
    loesen kann.

    Ich moechte zumindest nicht immer bei ner Instanziierung vor die Parameter ein UCHAR
    schreiben oder die Gefahr eingehen ein 'f' hinter meinen Parametern zu vergessen.

    Naja, soviel zu MHO 😉

    mfg
    v R



  • wie währe es einfach noch einen konstruktor für int zu schreiben ?



  • genau. warum muss der eine bei UCHAR bleiben? es hindert dich ja niemand daran, die attribute UCHARs zu lassen.



  • Gast_X schrieb:

    Puh .. Windows sag ich da nur.

    Das hat mit Windows aber nichts zu tun


Anmelden zum Antworten