web-dev-qa-db-fra.com

la fonction non membre ne peut pas avoir de qualificateur cv

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?

44
A. K.

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

94
Attila

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.

31
Bo Persson

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.

12
ecatmur

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

2
Xiaofeng.Wang