Подтвердить что ты не робот

Нечетная ошибка С++: test.cpp: 15: ошибка: передача 'const * as' этого аргумента '* отбрасывает квалификаторы

У меня возникают проблемы с конкретным кодом, если кто-то может просветить меня по этому вопросу, было бы весьма полезно, я выделил проблему в следующем примере:

#include <iostream>

using namespace std;

class testing{
   int test();
   int test1(const testing& test2);
};

int testing::test(){
   return 1;
}

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

Итак, что может привести к следующей ошибке:

test.cpp: 15: ошибка: передача 'const testing as' этот аргумент 'int testing:: test() отбрасывает квалификаторы

Спасибо большое!

4b9b3361

Ответ 1

Проблема заключается в вызове функции const не const для объекта const test2 из testing::test1.

testing::test1 получает test2 как параметр const testing &test2. Итак, внутри testing::test1, test2const. Тогда в первой строке функции:

test2.test()

Функция testing::test вызывается на test2. Эта функция не объявляется с const в конце подписи, поэтому она может изменять объект, на который он вызван (указатель this, неявно переданный ему), и даже если это не так, компилятор предполагает это. Позволяя вам называть его там, компилятор позволит вам изменить переменную const без явного приведения, что С++ не допускает. Поэтому, чтобы объяснить сообщение об ошибке:

test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers

this относится к объекту, на котором действует функция-член (testing::test), и в этом случае это не const, потому что testing::test не был объявлен с помощью const, и, таким образом, обнаружено несоответствие при попытке сделать указатель не const (this) относится к объекту const (testing), игнорируя квалификатор const.

Чтобы решить эту проблему, решите, нужна ли функция testing::test для изменения объекта, на который он вызван (способ, которым он теперь написан, это не так, поскольку все, что он делает, это return 1, однако это может измениться, поэтому вам нужно подумать о том, какова его предполагаемая функциональность). Если это так, то очевидно, что вызов его на объект const плох, хотя вы можете использовать const_cast, чтобы попросить компилятор переопределить это, но это опасно. Если это не так, то отметьте его const, чтобы его можно было вызвать и в объектах const:

class testing{
    int test1() const;
    // ...
}

int testing::test() const {
    // ...
}

Ответ 2

Из-за определения функции-члена test1:

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

Вы передаете ссылку const для переменной test2.

Это означает, что вы не можете изменять какой-либо член test2, и вы не можете вызвать какую-либо функцию-член, которая не является константой или не является статичной.

Вот как вы можете исправить:

int testing::test() const {
   return 1;
}

Дополнительная константа в конце сообщает компилятору, что вы не планируете изменять содержимое текущего объекта (и если вы это сделаете, вы получите другую компиляционную ошибку).

Ответ 3

Линия:   test2.test()

вызывает функцию non const, хотя test2 является ссылкой на константу. Это проблема. Вы можете исправить это, выполнив тестирование:: test const.

Ответ 4

testing:: test1 (const testing & test2) ожидает, что переданный объект будет const, и он даст вам ошибку, если вы либо измените значения этих переменных, либо получите доступ к любым их методам, которые явно не определены как Уст.

Поскольку метод test() фактически не изменяет никаких данных, лучше всего установить его const следующим образом:

class testing{
   int test() const;
   int test1(const testing& test2);
};

int testing::test() const {
   return 1;
}

В качестве альтернативы просто удалите слово const при определении аргументов для test1(), и это позволит вам получить доступ к любому из методов переданных объектов в свободное время.

Ответ 5

Для быстрого и грязного решения попробуйте выполнить компиляцию с -fpermissive, как это часто предлагает сам компилятор (возможно, это то, что делают компиляторы VisualStudio, поскольку пользователи Windows редко сообщают об этой проблеме).