Pregunta

¿Puede decirme por qué el siguiente código me da el siguiente error: llamada de sobrecargado " C (int) " es ambiguo

Creo que, dado que C (char x) es privado, solo el ctor C (flotante) es visible desde el exterior y eso debería llamarse convirtiendo int en flotante.

Pero ese no es el caso.

class C
{
    C(char  x)
    {
    }
public:
    C(float t)
    {
    }
};

int main()
{
    C p(0);
}
¿Fue útil?

Solución

Esto se discute en "Efectivo C ++" por Scott Meyer. La razón por la que esto es ambiguo es porque querían asegurarse de que simplemente cambiar la visibilidad de un miembro no cambiaría el significado del código ya existente en otro lugar.

De lo contrario, suponga que su clase C estaba en un encabezado en alguna parte. Si tuviera un miembro privado C (int), el código que presente llamaría C (flotante). Si, por alguna razón, el miembro C (int) se hiciera público, el código antiguo llamaría repentinamente a ese miembro, aunque ni el código antiguo ni la función a la que llamaba habían cambiado .

EDITAR: Más razones:

Aún peor, suponga que tiene las siguientes 2 funciones:

C A::foo() 
{
    return C(1.0);
}

C B::bar() 
{
    return C(1.0);
}

Estas dos funciones podrían llamar a funciones diferentes dependiendo de si foo o bar fueron declarados amigos de C, o si A o B heredan de él. Tener funciones de llamada de código idénticas diferentes da miedo.

(Probablemente no sea tan bien dicho como la discusión de Scott Meyer, pero esa es la idea).

Otros consejos

0 es un tipo int . Debido a que puede lanzarse implícitamente a un flotante o a un char por igual, la llamada es ambigua. La visibilidad es irrelevante para estos fines.

Ponga 0.0 , 0. o 0.0f , o elimine el C (char) constructor por completo.

Editar: porción relevante del estándar, sección 13.3:

  

3) [...] Pero, una vez que se han identificado las funciones candidatas y las listas de argumentos, la selección de la mejor función es la misma en todos los casos:

     
      
  • Primero, se selecciona un subconjunto de las funciones candidatas, aquellas que tienen el número adecuado de argumentos y cumplen ciertas otras condiciones, para formar un conjunto de funciones viables (13.3.2).
  •   
  • Luego, la mejor función viable se selecciona en función de las secuencias de conversión implícitas (13.3.3.1) necesarias para hacer coincidir cada argumento con el parámetro correspondiente de cada función viable.
  •   
     

4) Si existe una mejor función viable y es única, la resolución de sobrecarga tiene éxito y la produce como resultado. De lo contrario, la resolución de sobrecarga falla y la invocación está mal formada. Cuando la resolución de sobrecarga tiene éxito y la mejor función viable no es accesible (cláusula 11) en el contexto en el que se utiliza, el programa está mal formado.

Tenga en cuenta que la visibilidad no es parte del proceso de selección.

No creo que:

C p(0);

se está convirtiendo a:

C(float t)

probablemente necesite hacer:

C p(0.0f);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top