crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Ошибка компилятора: passing `const MyClass' as `this' argument of
Litkevich Yuriy
  опции профиля:
сообщение 9.4.2010, 10:16
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Помогите понять смысл ошибки компилятора.
Есть такой код:
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
  опции профиля:
сообщение 9.4.2010, 10:20
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


так все ж написано.
приведи весь код функции и объявление в заголовочном файле.
с квалификатором конст ты что то намутил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.4.2010, 10:25
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
  опции профиля:
сообщение 9.4.2010, 10:33
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Litkevich Yuriy,
компилятор не обманешь.
выложи кода побольше. какие челны есть, есть ли константные? перегруженные функции, есть ли констнатные?
где объект MyClass создаешь? не констнатный ли он?

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

ещё как передаётся. только без участия программиста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.4.2010, 10:38
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

Цитата(kwisp @ 9.4.2010, 14:33) *
ещё как передаётся. только без участия программиста.
я понимаю еслиб речь шла о Питоне, но не о С++.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 9.4.2010, 10:44
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(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
  опции профиля:
сообщение 9.4.2010, 10:47
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

П.С. у этого класса вообще из полей одна только константа строковая. Все остальные переменные локальные в функциях
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 9.4.2010, 10:55
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


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

ну ...
discards - отвергать, т.е. ясно что неверное использование квалификатора доступа. либо он лишний либо его не хватает. функцию компилятор тебе верно указал ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.4.2010, 11:04
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Litkevich Yuriy @ 9.4.2010, 11:47) *
П.С. у этого класса вообще из полей одна только константа строковая. Все остальные переменные локальные в функциях

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

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

ведь так и происходит.
в любом методе класса есть указатель this, и ты об этом знаешь, когда выбираешь квалификаторы доступа функциям и квалификаторы доступа объектам.
Причина редактирования: уточнение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 1:54