Lors de l'écriture de la fonction suivante abs
, j'obtiens l'erreur:
la fonction non membre unsigned int abs(const T&)
ne peut pas avoir de qualificateur cv.
template<typename T>
inline unsigned int abs(const T& t) const
{
return t>0?t:-t;
}
Après avoir supprimé le qualificatif const
pour la fonction, il n'y a pas d'erreur. Comme je ne modifie pas t
à l'intérieur de la fonction, le code ci-dessus aurait dû être compilé. Je me demande pourquoi j'ai eu l'erreur?
Votre désir de ne pas modifier t
s'exprime en const T& t
. La fin const
spécifie que vous ne modifierez aucune variable membre de la classe abs
appartient. Puisqu'il n'y a pas de classe à laquelle cette fonction appartient, vous obtenez une erreur
Le modificateur const
à la fin de la déclaration de fonction s'applique au paramètre this
masqué pour les fonctions membres.
Comme il s'agit d'une fonction libre, il n'y a pas de this
et ce modificateur n'est pas nécessaire.
Le paramètre t
a déjà son propre const
dans la liste des paramètres.
Le qualificatif cv d'une fonction membre spécifie que le pointeur this
doit avoir un type indirect _ const
(ou volatile
, const volatile
) et que par conséquent la fonction membre peut être appelée sur des instances avec cette qualification.
Les fonctions libres (et les fonctions statiques de classe) n'ont pas de pointeur this
.
Comme nous le savons tous, le mot clé const
suivi de la liste d'arguments indique qu'il s'agit d'un pointeur vers une constante de pointeur.
Il y a une fonction non-membre, elle n'appartient pas à la classe, donc une erreur de fin opposée à const se produit.
Solution au problème: consiste à devenir une fonction membre de la classe ou à supprimer le mot clé const
const opposé à la fin