Нечетная ошибка С++: 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() отбрасывает квалификаторы
Спасибо большое!
Ответы
Ответ 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 редко сообщают об этой проблеме).