2012-06-11 15 views
40

Al escribir la siguiente función abs, me sale el error:función no sea miembro no puede tener cv-calificador

función no miembro de unsigned int abs(const T&) no puede tener cv-calificador.

template<typename T> 
inline unsigned int abs(const T& t) const 
{ 
    return t>0?t:-t; 
} 

Después de retirar el calificador const para la función no hay error. Como no estoy modificando t dentro de la función, el código anterior debería haberse compilado. Me pregunto por qué obtuve el error.

Respuesta

84

su deseo de no modificar t se expresa en const T& t. La terminación const especifica que no modificará ninguna variable miembro de la clase a la que pertenece abs. Como no existe una clase a la que pertenece esta función, se obtiene un error

30

El modificador const al final de la declaración de función se aplica al parámetro oculto this para las funciones de miembro.

Como se trata de una función gratuita, no hay this y no es necesario que el modificador.

El parámetro t ya tiene su propio const en la lista de parámetros.

12

la CV-calificador en una función miembro especifica que el puntero this es haber indirected tipo const (o volatile, const volatile) y que, por tanto, la función miembro puede ser llamado en casos con que calificación.

funciones libre (y funciones estáticas clase) no tienen un puntero this.

1

Como todos sabemos, la palabra clave const seguida después de la lista de argumentos indica que este es un puntero a una constante de puntero.

hay una función no miembro, que no pertenece a la clase, por lo que añadir const contrario ocurre el error final.

Solución al problema: es la de convertirse en una función miembro de la clase o eliminar la const extremo opuesto const palabra clave

Cuestiones relacionadas