Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка компилятора: passing `const MyClass' as `this' argument of
Форум на CrossPlatform.RU > Разработка > Инструменты разработчика
Litkevich Yuriy
Помогите понять смысл ошибки компилятора.
Есть такой код:
void MyClass::somefunc()
{
    Type1 *var1;
    Type2 var2;
    Type2 var3;
    SomeType myvar;
    ...
    myvar = myfunc(var1, var2, var3); // <--- тут ошибка компиляции
    ...
    
}

SomeType MyClass::myfunc(Type1*, Type2, Type2)
{
    ...
}
При компиляции получаю такое сообщение об ошибке:
error: passing `const MyClass' as `this' argument of `SomeType MyClass::myfunc(Type1*, Type2, Type2)' discards qualifiers
kwisp
так все ж написано.
приведи весь код функции и объявление в заголовочном файле.
с квалификатором конст ты что то намутил.
Litkevich Yuriy
Цитата(kwisp @ 9.4.2010, 14:20) *
объявление в заголовочном файле.
    QModelIndex createNewRelativeData(QSqlTableModel *model,
                                      QString unitName,
                                      QString dataType);
квалификатора const ни где нет

Цитата(Litkevich Yuriy @ 9.4.2010, 14:16) *
const MyClass' as `this' argument of
мне вот совершенно не понятно причём здесь const MyClass', да ещё и "как `this' аргумент" в функцию не передаётся this
kwisp
Litkevich Yuriy,
компилятор не обманешь.
выложи кода побольше. какие челны есть, есть ли константные? перегруженные функции, есть ли констнатные?
где объект MyClass создаешь? не констнатный ли он?

Цитата(Litkevich Yuriy @ 9.4.2010, 11:25) *
в функцию не передаётся this

ещё как передаётся. только без участия программиста.
Litkevich Yuriy
Цитата(kwisp @ 9.4.2010, 14:33) *
где объект MyClass создаешь? не констнатный ли он?
а причем здесь, он. Ну пусть константный, ну и что. Что с вызовом функции не так?

Цитата(kwisp @ 9.4.2010, 14:33) *
ещё как передаётся. только без участия программиста.
я понимаю еслиб речь шла о Питоне, но не о С++.
kwisp
Цитата(Litkevich Yuriy @ 9.4.2010, 11:37) *
а причем здесь, он. Ну пусть константный, ну и что. Что с вызовом функции не так?

оба-на! как ну и что? функция к неконстантным членам имеет доступ? имеет. почему? потому что она не константная!
небось еще и свойства объекта меняешь какие небудь!
сделай перегруженную константную функцию и пользуйся своим константным объектом.
:)

Цитата(Litkevich Yuriy @ 9.4.2010, 11:38) *
я понимаю еслиб речь шла о Питоне, но не о С++.

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

Цитата(Litkevich Yuriy @ 9.4.2010, 11:38) *
Ну пусть константный, ну и что. Что с вызовом функции не так?

побольше кода и всё станет ясно.
объявление и определение метода класа, членов, создание объекта класса и использование.
Litkevich Yuriy
проблему решил, однако компиллер неуместное сообщение формирует.
void MyClass::somefunc()
объявлена с квалификатором const. Внутри неё вызывалась myfunc, без оного.
В связи с чем сообщение должно было бы выглядеть:
"вызов не константное myfunc внутри константной функции", всё было бы понятно.

П.С. у этого класса вообще из полей одна только константа строковая. Все остальные переменные локальные в функциях
kwisp
Цитата(Litkevich Yuriy @ 9.4.2010, 11:47) *
однако компиллер неуместное сообщение формирует.
void MyClass::somefunc()
объявлена с квалификатором const. Внутри неё вызывалась myfunc, без оного.
В связи с чем сообщение должно было бы выглядеть:
"вызов не константное myfunc внутри константной функции", всё было бы понятно.

ну ...
discards - отвергать, т.е. ясно что неверное использование квалификатора доступа. либо он лишний либо его не хватает. функцию компилятор тебе верно указал ...
Litkevich Yuriy
Цитата(Litkevich Yuriy @ 9.4.2010, 14:16) *
discards qualifiers
буквально "бракованные квалификаторы" (хотя может тут discards - глагол).
Столку сбивает тот факт, что якобы я помещаю константный экземпляр своего класса в качестве this.
kwisp
Цитата(Litkevich Yuriy @ 9.4.2010, 11:47) *
П.С. у этого класса вообще из полей одна только константа строковая. Все остальные переменные локальные в функциях

это не никак не освобождает от запрета вызова неконстантной функции константного объекта, даже если в последнем одно поле и то константное.

Цитата(Litkevich Yuriy @ 9.4.2010, 12:04) *
Столку сбивает тот факт, что якобы я помещаю константный экземпляр своего класса в качестве this.

ведь так и происходит.
в любом методе класса есть указатель this, и ты об этом знаешь, когда выбираешь квалификаторы доступа функциям и квалификаторы доступа объектам.
Iron Bug
Цитата(Litkevich Yuriy @ 9.4.2010, 14:04) *
Цитата(Litkevich Yuriy @ 9.4.2010, 14:16) *
discards qualifiers
буквально "бракованные квалификаторы" (хотя может тут discards - глагол).
Столку сбивает тот факт, что якобы я помещаю константный экземпляр своего класса в качестве this.

discards qualifiers никак не может быть переведено как "бракованные квалификаторы". тут значение совершенно однозначно: "отбрасывает квалификаторы".
а указатель this при работе передаётся первым параметром в любой метод класса. просто эта часть работы с виртуальными таблицами скрыта от программиста. читайте классику.
Tonal
Говоря совсем просто, компилятор ругается на вызов неконстантной функции из константной.
При этом состав полей класса неважен. Как и то что вызываемая функция может ничего в экземпляре не менять.
Важно только наличие квалификатора const в сигнатурах.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.