ошибка: передача 'const ...' в качестве 'этого' аргумента '…' отбрасывает квалификаторы в вызывающем методе

Я передаю ссылку на объект функции, и я использовал const, чтобы указать, что это метод только для чтения, но если я вызываю другой метод внутри этого метода, эта ошибка возникает, даже если я не передаю ссылку в качестве аргумента .

ошибка: передача 'const A' как 'this' аргумента void A :: hello () 'отбрасывает квалификаторы [-fpermissive]

ошибка: передача 'const A' в качестве 'этого' аргумента void A :: world () 'отбрасывает квалификаторы [-fpermissive]

#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;
}

person yayuj    schedule 17.11.2014    source источник
comment
что случилось с самым коротким кодом ....   -  person Karoly Horvath    schedule 17.11.2014
comment
Метод, помеченный как const, должен вызывать только const методы и не пытаться изменять переменную-член (кроме mutable).   -  person Niall    schedule 17.11.2014
comment
... даже если я не передаю ссылку в качестве аргумента. Вы передаете ее из-за неявного аргумента this.   -  person Oktalist    schedule 17.11.2014
comment
@Oktalist - Извините за мое незнание, но что вы имеете в виду?   -  person yayuj    schedule 17.11.2014
comment
@MrAlmighty hello(); world(); на самом деле означает this->hello(); this->world();.   -  person Oktalist    schedule 17.11.2014
comment
@Oktalist - Но где я передаю что-нибудь в качестве ссылки? Я не понимаю.   -  person yayuj    schedule 17.11.2014
comment
Когда sayhi вызывается через a.sayhi(), this указывает на тот же объект, на который ссылается a.   -  person Oktalist    schedule 17.11.2014
comment
Возможный дубликат ошибки : передача 'const…' как 'this' аргумент "…" отбрасывает квалификаторы   -  person Bak Itzik    schedule 03.08.2016


Ответы (1)


Поскольку sayhi() равно const, все вызываемые им функции также должны быть объявлены const, в данном случае hello() и world(). Ваш компилятор предупреждает вас о вашей const-корректности.

person Cory Kramer    schedule 17.11.2014
comment
Программа плохо сформирована. Это не предупреждения. - person Kerrek SB; 17.11.2014
comment
Мне не следовало использовать слово «предупреждение», потому что я не имел в виду, что это предупреждения компилятора. Я имел в виду, что это было .... советовал им, у меня нет большого словарного запаса :) - person Cory Kramer; 17.11.2014
comment
Слово, которое вы ищете, неверно сформировано или ошибка :-) На самом деле программа имеет неправильный формат, даже если вы не пытаетесь ее скомпилировать. - person Kerrek SB; 17.11.2014