2014-11-16 24 views
7

error: passing 'const A' as 'this' argument of 'void A::hi()' discards qualifiers [-fpermissive]hatası: 'const…' ifadesi 'bu' argümanı '…' niteleyicileri atar

Neden bu hatayı alıyorum anlamıyorum, nesnenin referansını geçerek hiçbir şey döndürmüyorum Ve işte bu.

#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

Ben const doğruluğunu kullanarak ama şimdi aynı yöntemi içindeki yöntemleri çağırmak için çalışıyorum ve aynı hatayı alıyorum, ama garip şey ben olmasıdır sabit referansı bu yönteme geçirmeyen m.

#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',“ non-'const ”üye işlevidir; '' '' const’dir. –

+0

geçişi bir (örtük) bağımsız değişken olarak anlamına gelir. Dönen bir şey yok. – Deduplicator

+2

Olasının [xxx'in 'this' argümanı olarak niteleyici atanması [xxx: xxx olarak iletilmesi] 'nin olası kopyası (http://stackoverflow.com/questions/5973427/error-passing-xxx-as-this-argument-of-xxx-discards- niteleyiciler) –

cevap

9

Sizin hi yöntemi bir sınıf içinde const olarak bildirilmedi. Bu nedenle, derleyici, a.hi() numaralı telefonun sabit referansınızı a olarak değiştirmeyeceğini garanti edemez, dolayısıyla bir hata oluşturur.

here sabit üye işlevleri hakkında daha fazla bilgi ve const anahtar sözcüğünü doğru kullanma here.

+0

'void hi() const' olarak değiştirdim ve şimdi çalışıyor. Doğru mu? const doğruluğu olan bir boşluk mu? – yayuj

+3

Evet. Const, derleyiciye bu işlevin içinde hiçbir şeyin değişmeyeceğini söyler. Dönüş tipi bu – Eric

+1

ile ilgili değildir Bu durumda, a.hi() 'nesneyi değiştirmediğinden, bu doğru olur. Ayrıca, diğer programcılara bunun "salt okunur" bir yöntem olduğunu bildirmesine yardımcı olur ve nesneyi herhangi bir şekilde değiştirmemesi garanti edilir. – therealrootuser

İlgili konular