2014-11-16 10 views
7

error: passing 'const A' as 'this' argument of 'void A::hi()' discards qualifiers [-fpermissive]błąd: przekazanie "const ..." jako "tego" argumentu kwalifikatorów "..." odrzucających

Nie rozumiem, dlaczego otrzymuję ten błąd, nie zwracam niczego po prostu przez podanie odniesienia do obiektu i to jest to.

#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

Naprawiłem go za pomocą const poprawności ale teraz staram się wywołać metody wewnątrz tej samej metody i uzyskać ten sam błąd, ale dziwne jest to, że ja” nie przekazuję odniesienia do tej metody.

#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' jest funkcją członkowską non-'const'; "a" to "const". –

+0

przekazywanie oznacza jako (niejawny) argument. Nie ma nic wspólnego z powrotem. – Deduplicator

+2

Możliwy duplikat [błąd: podanie xxx jako "ten" argument kwalifikatorów xxx discards] (http://stackoverflow.com/questions/5973427/error-passing-xxx-as-this-argument-of-xxx-discards- kwalifikatory) –

Odpowiedz

9

Twoja metoda hi nie jest zadeklarowana jako const wewnątrz swojej klasy. W związku z tym kompilator nie może zagwarantować, że wywołanie a.hi() nie zmieni stałego odniesienia do a, a tym samym powoduje błąd.

Możesz przeczytać więcej na temat funkcji stałych członów here i prawidłowego użycia słowa kluczowego here.

+0

Zmieniłem na 'void hi() const', a teraz działa. Czy to jest poprawne? pustka ze stałą poprawnością? – yayuj

+3

Tak. Const mówi kompilatorowi, że nic nie zmieni się wewnątrz tej funkcji. Typ powrotu nie ma związku z tym – Eric

+1

W tym przypadku, ponieważ 'a.hi()' nie zmienia obiektu, byłoby to poprawne. Pomaga to również informować innych programistów, że jest to metoda "tylko do odczytu" i gwarantuje, że nie zmutuje obiektu w żaden sposób. – therealrootuser

Powiązane problemy