2012-06-11 11 views
40

Mentre scrivevo la seguente funzione abs, ottengo l'errore:funzione non-membro non può avere cv-qualificazione

funzione non-membro unsigned int abs(const T&) non può avere cv-qualificazione.

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

Dopo aver rimosso la qualificazione const per la funzione non esiste nessun errore. Poiché non sto modificando t all'interno della funzione, il codice sopra dovrebbe essere compilato. Mi chiedo perché ho ricevuto l'errore?

risposta

84

Il desiderio di non modificare t è espresso in const T& t. Il finale const specifica che non verranno modificate le variabili membro della classe abs. Poiché non esiste una classe a cui appartiene questa funzione, viene visualizzato un errore

30

Il modificatore const alla fine della dichiarazione di funzione si applica al parametro nascosto this per le funzioni membro.

Poiché si tratta di una funzione gratuita, non è presente this e tale modifica non è necessaria.

Il parametro t ha già il proprio const nell'elenco dei parametri.

12

CV-qualificazione su una funzione membro specifica che il puntatore this è dovuto tipo modo indiretto const (o volatile, const volatile) e che quindi la funzione membro può essere chiamato istanze con tale qualifica.

Le funzioni gratuite (e le funzioni statiche di classe) non hanno un puntatore this.

1

Come tutti sappiamo, la parola chiave const seguita dopo l'elenco degli argomenti indica che si tratta di un puntatore a una costante del puntatore.

C'è una funzione non membro, non appartiene alla classe, quindi si verifica l'errore di fine opposto const.

Soluzione del problema: è o diventare una funzione membro della classe o rimuovere la parola const const estremità opposta

Problemi correlati