2014-11-16 10 views
7

error: passing 'const A' as 'this' argument of 'void A::hi()' discards qualifiers [-fpermissive]errore: passare 'const ...' come 'this' argomento di '...' scarta qualificatori

Non capisco perché sto ricevendo questo errore, non sto restituendo nulla solo passando il riferimento dell'oggetto e questo è tutto.

#include <iostream> 

class A 
{ 
public: 
    void hi() 
    { 
     std::cout << "hi." << std::endl; 
    } 
}; 

class B 
{ 
public: 
    void receive(const A& a) { 
     a.hi(); 
    } 
}; 

class C 
{ 
public: 
    void receive(const A& a) { 
     B b; 
     b.receive(a); 
    } 
}; 

int main(int argc, char ** argv) 
{ 
    A a; 
    C c; 
    c.receive(a); 

    return 0; 
} 

@EDIT

ho riparato utilizzando const correttezza, ma ora sto cercando di chiamare i metodi all'interno dello stesso metodo ed ottengo lo stesso errore, ma la cosa strana è che ho' m non passando il riferimento a questo metodo.

#include <iostream> 

class A 
{ 
public: 
    void sayhi() const 
    { 
     hello(); 
     world(); 
    } 

    void hello() 
    { 
     std::cout << "world" << std::endl; 
    } 

    void world() 
    { 
     std::cout << "world" << std::endl; 
    } 
}; 

class B 
{ 
public: 
    void receive(const A& a) { 
     a.sayhi(); 
    } 
}; 

class C 
{ 
public: 
    void receive(const A& a) { 
     B b; 
     b.receive(a); 
    } 
}; 

int main(int argc, char ** argv) 
{ 
    A a; 
    C c; 
    c.receive(a); 

    return 0; 
} 

error: passing 'const A' as 'this' argument of 'void A::hello()' discards qualifiers [-fpermissive]

error: passing 'const A' as 'this' argument of 'void A::world()' discards qualifiers [-fpermissive]

+1

'hi' è una funzione membro non-'const'; 'a' è' const'. –

+0

passing significa come argomento (implicito). Non ha niente a che fare con il ritorno. – Deduplicator

+2

Possibile duplicato di [errore: passare xxx come 'questo' argomento di xxx scarta qualificatori] (http://stackoverflow.com/questions/5973427/error-passing-xxx-as-this-argument-of-xxx-discards- qualificazioni) –

risposta

9

Il tuo metodo hi non è dichiarato come const all'interno del vostro Una classe. Pertanto, il compilatore non può garantire che la chiamata a.hi() non cambierà il riferimento costante a a, pertanto genera un errore.

È possibile leggere ulteriori informazioni sulle funzioni membro costante here e sull'uso corretto della parola chiave here.

+0

Ho cambiato in 'void hi() const' e ora funziona. È giusto? un vuoto con correttezza const? – yayuj

+3

Sì. Il const dice al compilatore che nulla cambierà all'interno di quella funzione. Il tipo di ritorno non è rilevante per questo – Eric

+1

In questo caso, poiché 'a.hi()' non cambia l'oggetto, questo sarebbe corretto. Aiuta anche ad informare gli altri programmatori che si tratta di un metodo di "sola lettura", ed è garantito che non muta l'oggetto in alcun modo. – therealrootuser

Problemi correlati