Question

Pouvez-vous me dire pourquoi le code suivant me donne l'erreur suivante - appel de surcharge "C (int)" est ambigu

Je pense que puisque C (char x) est privé, seul le ctor C (float) est visible de l'extérieur et il convient de l'appeler en convertissant int en float.

Mais ce n'est pas le cas.

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

int main()
{
    C p(0);
}
Était-ce utile?

La solution

Ceci est décrit dans "Effective C ++". par Scott Meyer. La raison pour laquelle cela est ambigu est qu’ils voulaient faire en sorte que le simple fait de changer la visibilité d’un membre ne changerait pas la signification du code déjà existant ailleurs.

Sinon, supposons que votre classe C se trouve dans un en-tête quelque part. Si vous aviez un membre C (int) privé, le code que vous présenteriez serait appelé C (float). Si, pour une raison quelconque, le membre C (int) était rendu public, l'ancien code l'appellerait soudainement, même si ni l'ancien code, ni la fonction qu'il avait appelée n'avaient changé .

EDIT: Plus de raisons:

Pire encore, supposons que vous ayez les 2 fonctions suivantes:

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

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

Ces deux fonctions peuvent appeler des fonctions différentes selon que foo ou bar a été déclaré ami de C, ou si A ou B en hérite. Avoir un code identique appeler différentes fonctions est effrayant.

(Ce n'est probablement pas aussi bien que le propos de Scott Meyer, mais c'est l'idée.)

Autres conseils

0 est un type int . Puisqu'il peut être implicitement converti en float ou en caractère, l'appel est ambigu. La visibilité n’a aucune incidence sur ces objectifs.

Entrez 0.0 , 0. ou 0.0f , ou supprimez le C (char) constructeur entièrement.

Modifier: partie pertinente de la norme, section 13.3:

  

3) [...] Mais, une fois que les fonctions candidates et les listes d'arguments ont été identifiées, la sélection de la meilleure fonction est la même dans tous les cas:

     
      
  • Tout d'abord, un sous-ensemble des fonctions candidates (celles qui possèdent le nombre approprié d'arguments et remplissent certaines autres conditions) est sélectionné pour former un ensemble de fonctions viables (13.3.2).
  •   
  • Ensuite, la meilleure fonction viable est sélectionnée en fonction des séquences de conversion implicites (13.3.3.1) nécessaires pour faire correspondre chaque argument au paramètre correspondant de chaque fonction viable.
  •   
     

4) Si la meilleure fonction viable existe et est unique, la résolution de surcharge réussit et le produit comme résultat. Sinon, la résolution de surcharge échoue et l'invocation est mal formée. Lorsque la résolution de surcharge réussit et que la meilleure fonction viable n’est pas accessible (clause 11) dans le contexte dans lequel elle est utilisée, le programme est mal formé.

Notez que la visibilité ne fait pas partie du processus de sélection.

Je ne pense pas que:

C p(0);

est converti en:

C(float t)

vous devez probablement faire:

C p(0.0f);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top