¿Puede alguien explicarme por qué en el siguiente código recibo una llamada ambigua a los constructores sobrecargados en Foo si intento crear una instancia de MyFooC? Mi suposición era que el entero utilizado como un parámetro constructor habría sido promovido a un int sin firmar y se habría resuelto, pero esto es obviamente incorrecto.Ambigüedad entre constructores sobrecargados
template <typename t> class Foo
{
private:
t m_Value;
unsigned int m_Length;
public:
Foo(const t& Value) :
m_Value(Value),
m_Length(0)
{
}
Foo(unsigned int Length) :
m_Value(static_cast<t>(0)),
m_Length(Length)
{
}
};
int main()
{
Foo<double> MyFooA(32U);
Foo<double> MyFooB(32.0f);
//Foo<double> MyFooC(32);
return 0;
}
Se prefieren las "Promociones" a las "conversiones", por lo que dado un 'char', una función que tome' int' será preferible a una que tome 'double'. Pero el estándar C++ usa una definición muy limitada de "promoción"; básicamente, una promoción es una conversión que tendrá lugar en un operador binario donde ambos operandos tienen el mismo tipo. (Por ejemplo, si agrega dos 'short', ambos se promocionan a' int' antes de la suma.) –
Ahh, no estaba al tanto de eso, gracias. – Jodaka