Плавающая точка и целочисленная неопределенность - PullRequest
3 голосов
/ 03 октября 2010

У меня есть функция (и конструктор), которая должна принимать целочисленные значения и значения с плавающей запятой. На самом деле я хочу, чтобы он взял int64_t или long double, так что я хочу,

class Foo {
    public:
    Foo(int64_t value=0);
    Foo(long double value);
};

Однако, если я сделаю это и попробую Foo f = 1;, компилятор пожалуется на неоднозначность преобразования из int в Foo. Хорошо, но если я изменю первый конструктор на int32_t, такой двусмысленности не будет. Может кто-нибудь объяснить мне, почему это так.

1 Ответ

8 голосов
/ 03 октября 2010

Тип литерала 1 - int.Любой конструктор будет нуждаться в преобразовании int в int64_t против int в long double.Компилятор не считает, что какой-либо из них предпочтительнее, поэтому он жалуется.Решите это, добавив конструктор Foo (int).Или приведение литерала, как (int64_t) 1.

...