Qu'est-ce que la surcharge d'opérateur?
Sbi de la célèbre surcharge d'Opérateur faq réponses ceci en détail.
Pourquoi les deux function
versions de l'OP le droit d'exister?
Remarquez qu'ils prendre différentes paramètre de la fonction des types(int
et float
), et donc admissible à titre de fonction valide les surcharges.
Qu'est-ce que la résolution de surcharge?
C'est le processus de sélection le plus approprié en fonction de/à l'exploitant par le compilateur de la mise en œuvre. Si une meilleure viable fonction existe et est unique, résolution de surcharge réussit et produit comme résultat. Sinon résolution de surcharge échoue et que l'appel est traité comme mal formé et compilateur fournit un diagnostic. Le compilateur utilise la conversion implicite de la séquence pour trouver le meilleur le match.
C++03 Standard 13.3.3.1 Conversions Implicites:
Une conversion implicite de la séquence est une séquence de conversion utilisés pour convertir un argument dans un appel de fonction, le type du paramètre correspondant de la fonction appelée.
La conversion implicite des séquences peut être l'une des catégories suivantes:
- Une conversion standard de la séquence(13.3.3.1.1)
- Une conversion définie par l'utilisateur de la séquence(13.3.3.1.2)
- Les points de suspension de la conversion de la séquence(13.3.3.1.3)
Notez que chacun de ces sont classés afin de déterminer la meilleure viable fonction. La plus viable fonction est celle dont tous les paramètres ont soit mieux ou égalité de rang conversion implicite séquences que toutes les autres viable fonctions.La norme détaille chacun de ces en détail dans les sections respectives. La conversion standard de la séquence est pertinente dans la présente affaire, il est ainsi résumée:
Avec assez de fond sur la surcharge de résolution.
examinons les exemples de code dans l'OP:
function(1.2,2.2);
Règle importante: 1.2
et 2.2
sont des littéraux et ils sont traités comme un double
type de données.
Lors de la conversion implicite des séquences de cartographie:
À la fois le paramètre de la fonction littéraux avec double
type de besoin d'une conversion rang pour appeler l' float
ou int
version et aucun n'est un meilleur match que les autres, ils obtiennent exactement le même sur la conversion rang. Le compilateur est incapable de détecter le plus viable match et il signale une ambiguïté.
function(1.2,2);
Lors de la conversion implicite de la séquence de la cartographie:
L'un des paramètres de la fonction 2
a une correspondance exacte avec l' int
fonction de la version, tandis qu'un autre 1.2
a une conversion de rang. Pour la fonction qui prend en float
que les paramètres de la conversion implicite des séquences pour les deux paramètres sont de conversion rang.
Donc la fonction qui prend en int
version des scores meilleurs que l' float
version et c'est le meilleur match et est appelée.
Comment résoudre la surcharge des erreurs d'ambiguïté?
Si vous ne voulez pas de conversion implicite de la séquence de la cartographie à vous jeter hors, il suffit de fournir des fonctions et de les appeler, de telle manière que les paramètres sont une correspondance exacte. Depuis correspondance exacte au cours des scores de tous les autres, Vous avez une garantie définitive de la fonction souhaitée appelé. Dans votre cas, il y a deux façons de le faire:
Solution 1:
Appel de la fonction, de sorte que les paramètres sont en correspondance exacte pour les fonctions disponibles.
function(1.2f,2.2f);
Depuis 1.2f
et 2.2f
sont traités en tant que float
des types qu'ils correspondent exactement à l' float
fonction de la version.
Solution 2:
Fournir une fonction de surcharge qui correspond exactement au type de paramètre dans la fonction appelée.
function(double, double){}
Depuis 1.2
et 2.2
sont traités en tant que double
la fonction appelée est exact de cette surcharge.