2010-10-03 6 views
3

J'ai une fonction (et un constructeur) qui devrait être capable de prendre des valeurs entières et des valeurs à virgule flottante. En fait, je veux prendre un int64_t ou un long double, donc ce que je veux est,Floating point et ambiguïté entière

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

Cependant, si je fais cela et essayer Foo f = 1; le compilateur se plaint de la conversion de int à Foo être ambigu. Ok, mais si je change le premier constructeur pour prendre un int32_t il n'y a pas une telle ambiguïté. Quelqu'un peut-il m'expliquer pourquoi c'est le cas.

Répondre

8

Le type du 1 litéral est int. Chaque constructeur va avoir besoin d'une conversion, int à int64_t vs int à long double. Le compilateur ne pense pas que l'un ou l'autre est préférable, donc il se plaint. Résolvez-le en ajoutant un constructeur Foo (int). Ou lancer le littéral, comme (int64_t) 1.

+2

Ah oui, merci. Logique. Je suis un peu surpris que le compilateur ne reconnaisse pas 'int64_t' comme une correspondance plus proche d'un' int' qu'un 'double' est bien. (Je suppose que parce qu'une conversion est une conversion et c'est tout ce qui l'inquiète (?)) – tjm