2016-12-14 2 views
0

У меня есть-структура с фабричными методами определена следующим образом:Неправильного разрешения статического метода в 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); }; 
}; 

Используя следующий код в Visual Studio 2015:

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

приводит к предупреждению:

предупреждение C4244: 'аргумент': преобразование из '__int64' в 'double', возможную потерю данных

Компилятор явно принимает неправильный метод, так как у меня есть выделенный вариант для long long. В чем причина такого поведения? Излишне говорить, что это прекрасно работает в clang и gcc без предупреждения.

ответ

0

Отсутствует компилятор. Вы должны называть fromInt, потому что у него есть тип данных, который соответствует длинному долгу. gcc также выдаст предупреждение, если вы нажмете -Wall в своей команде.

+0

OMG, как неудобно, спасибо. –

+0

Нет проблем. Я делаю худшие ошибки. Это всего лишь отсутствие внимания в течение нескольких секунд, и все идет не так. – user902384

+0

Upvote? Принять ответ? Я намерен обыграть Джона Скита. : D – user902384

Смежные вопросы