У меня есть-структура с фабричными методами определена следующим образом:Неправильного разрешения статического метода в 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 без предупреждения.
OMG, как неудобно, спасибо. –
Нет проблем. Я делаю худшие ошибки. Это всего лишь отсутствие внимания в течение нескольких секунд, и все идет не так. – user902384
Upvote? Принять ответ? Я намерен обыграть Джона Скита. : D – user902384