Visual C ++中的静态方法解析错误

时间:2016-12-14 12:41:53

标签: 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'要“重复”,可能会丢失数据

编译器显然采用了错误的方法,因为我有long long的专用变体。这种行为的原因是什么?毋庸置疑,这在没有警告的情况下在clang和gcc中运行良好。

1 个答案:

答案 0 :(得分:0)

没有编译器是对的。您应该调用fromInt,因为它的数据类型与long long匹配。如果你在命令中点击-Wall,gcc也会发出警告。