2016-12-14 2 views
0

ich eine Struktur mit Factory-Methoden wie folgt definiert haben:Falsche statische Methode Auflösung in Visual C++

struct EvalValue 
{ 
    enum ValueType { Float, Int, Null, NotNull } type; // NULL and NOT NULL are possible literals, so we need an enum for them. 
    double number; 

    EvalValue (ValueType aType, double aNumber) : type(aType), number(aNumber) {} 
    static EvalValue fromBool(bool value) { return EvalValue(Int, value ? 1 : 0); }; 
    static EvalValue fromNumber(double number) { return EvalValue(Float, number); }; 
    static EvalValue fromInt(long long number) { return EvalValue(Int, (double)number); }; 
}; 

Verwendung des folgenden Codes in Visual Studio 2015:

EvalValue function test() { 
    long long a = 0; 
    return EvalValue::fromNumber(a); 
} 

auf die Warnung führt:

Warnung C4244: 'Argument': Konvertierung von '__int64' zu 'double', möglicher Datenverlust

Der Compiler übernimmt eindeutig die falsche Methode, da ich eine dedizierte Variante für long long habe. Was ist der Grund für dieses Verhalten? Unnötig zu sagen, dass dies ohne Vorwarnung in clang und gcc funktioniert.

Antwort

0

Kein Compiler ist richtig. Sie sollten fromInt aufrufen, weil das einen Datentyp hat, der mit long long übereinstimmt. gcc würde auch eine Warnung ausgeben, wenn Sie -Will in Ihrem Befehl.

+0

OMG wie peinlich, danke. –

+0

Kein Problem. Ich mache schlimmere Fehler. Es ist nur ein Mangel an Aufmerksamkeit für einige Sekunden und Dinge laufen schief. – user902384

+0

Upvote? Antwort annehmen? Ich habe vor, Jon Skeet zu schlagen. : D – user902384