2014-11-16 14 views
7

Ich verstehe nicht, warum ich diesen Fehler bekomme, ich gebe nichts zurück, nur die Referenz des Objekts übergeben und das ist alles.Fehler: Übergabe 'const ...' als 'dieses' Argument von '...' löscht Qualifiers

#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

Ich reparierte es const Korrektheit verwenden, aber jetzt innerhalb der gleichen Methode Methoden aufrufen und ich bekomme den gleichen Fehler Ich versuche, aber die seltsame Sache ist, dass ich Ich übergebe den Verweis auf diese Methode nicht.

#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' ist eine Nicht-' const' Elementfunktion; 'a' ist' const'. –

+0

Weitergabe bedeutet als (implizites) Argument. Hat nichts mit der Rückkehr zu tun. – Deduplicator

+2

Mögliches Duplikat von [Fehler: xxx übergeben als 'dieses' Argument von xxx verwirft Qualifier] (http://stackoverflow.com/questions/5973427/error-passing-xxx-as-this-argument-of-xxx-discards- Qualifier) ​​ –

Antwort

9

Ihre hi Methode wird nicht als const in Ihrer A-Klasse erklärt. Daher kann der Compiler nicht garantieren, dass das Aufrufen von a.hi() Ihren konstanten Verweis auf a nicht ändert, daher wird ein Fehler ausgelöst.

Sie können mehr über konstante Mitgliederfunktionen here und korrekte Verwendung des const Schlüsselwort here lesen.

+0

Ich habe mich in 'void hi() const' geändert und jetzt funktioniert es. Ist es richtig? eine Leere mit const Korrektheit? – yayuj

+3

Ja. Das const teilt dem Compiler mit, dass sich innerhalb dieser Funktion nichts ändern wird. Der Rückgabetyp ist dafür nicht relevant – Eric

+1

In diesem Fall, da 'a.hi()' das Objekt nicht ändert, wäre dies korrekt. Es hilft auch anderen Programmierern zu informieren, dass dies eine "Nur-Lese" -Methode ist, und garantiert nicht mutieren das Objekt in irgendeiner Weise. – therealrootuser

Verwandte Themen