Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка инкремента? Что то странное творится при наследовани 
V
    Опции темы
IvanoffAndrey
Дата 16.9.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 8.7.2006
Где: СГАУ

Репутация: нет
Всего: 2



Здравствуйте. Данная тема уже поднималась на этом форуме. http://forum.vingrad.ru/topic-17379.html Но толи там ошибка в формулировки проблемы то ли в чем непонятно. Короче, у меня ситуация полность противоположенная.
Непроходит вот этот код
Код

template <typename T> class Fs{
    public:
        virtual Fs<T> const operator ++(int){return(*this);}
    };
template <typename T> class Ss:public Fs<T>{
    Ss(void){}
    Ss(Fs<T> const&) {}
    public:
        Ss<T> const operator ++(int){return(*this);}
};

Решение этой проблемы я уже прочитал в топике ранее. 
Однако не понятно: почему не компилируется данный код? 
Ошибка: Error    1    error C2555: 'Ss<T>::operator ++': overriding virtual function return type differs and is not covariant from 'Fs<T>::operator ++'

Это сообщение отредактировал(а) IvanoffAndrey - 16.9.2007, 17:33
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
archimed7592
Дата 16.9.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Тип возвращаемого значения виртуальной ф-ции если и можно менять(не помню), то в очень ограниченных рамках.

Добавлено через 14 секунд
Сделай опретор не виртуальным и всё будет гут.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Daevaorn
Дата 16.9.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(IvanoffAndrey @  16.9.2007,  17:54 Найти цитируемый пост)
Однако не понятно: почему не компилируется данный код? 

Потомо что идет перекрытие унаследованного оператора, но при этом у наследника возвращаемый тип другой.
PM MAIL WWW   Вверх
Skladnoy
Дата 16.9.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Ну во первых, работа телепата в наше время оплачивается отчаянно хорошо, и все телепаты телепортировались кто на Багамы, кто куда. Поэтому было бы неплохо написать на что именно ругается компилятор. 

Проблем в коде две:
1. Приватные конструкторы класса Ss (название вполне бессмысленное)
2. Операторы имеют разный тип возвращаемого значения и не могут быть перегружены. Делать их виртуальными потому бессмысленно. Можно применить маленькую хитрость описанную в "уже поднятой теме"
PM MAIL   Вверх
IvanoffAndrey
Дата 16.9.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 8.7.2006
Где: СГАУ

Репутация: нет
Всего: 2



Цитата

Тип возвращаемого значения виртуальной ф-ции если и можно менять(не помню), то в очень ограниченных рамках.

Т.е. Тип возвращаемого значения вирутальной функции можно сменить с Fs<T> & на Ss<T> & (при виртуальности префиксного оператора), а вот с Fs<T> const на Ss<T> const  нельзя? 
Ну это вооще же неочевидно.
А Где можно посмотреть про то в каких пределах можно менять тип возвращаемого значения виртуальной функции?
Цитата

Поэтому было бы неплохо написать на что именно ругается компилятор. 

Исправился.
Я честно говоря впервые столкнулся с этим вопросом. 


--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
Daevaorn
Дата 16.9.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(IvanoffAndrey @  16.9.2007,  18:34 Найти цитируемый пост)
А Где можно посмотреть про то в каких пределах можно менять тип возвращаемого значения виртуальной функции?

http://www.kuzbass.ru/docs/isocpp/derived.html#class.virtual
пункт 5
PM MAIL WWW   Вверх
IvanoffAndrey
Дата 16.9.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 8.7.2006
Где: СГАУ

Репутация: нет
Всего: 2



Цитата

The return type of an overriding function shall be either identical to the return type of the overridden function or covariant with the classes of the functions. If a function D::f overrides a function B::f, the return types of the functions are covariant if they satisfy the following criteria:

    * both are pointers to classes or references to classes*

          [Footnote: Multi-level pointers to classes or references to multi-level pointers to classes are not allowed. --- end foonote]

    * the class in the return type of B::f is the same class as the class in the return type of D::f or, is an unambiguous direct or indirect base class of the class in the return type of D::f and is accessible in D 

    * both pointers or references have the same cv-qualification and the class type in the return type of D::f has the same cv-qualification as or less cv-qualification than the class type in the return type of B::f. 

If the return type of D::f differs from the return type of B::f, the class type in the return type of D::f shall be complete at the point of declaration of D::f or shall be the class type D. When the overriding function is called as the final overrider of the overridden function, its result is converted to the type returned by the (statically chosen) overridden function (expr.call).


Плиз переведите в кратце о чем говорится. А то я что то пасую перед этим текстом. Знаний англицкого не хватает.
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
archimed7592
Дата 16.9.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Это должна быть ссылка на класс или указатель на класс.
Класс на который ссылаемся/указываем должен быть таким же или в Ss-версии должен быть класс прямо или косваенно унаследованный от класса из Fs-версии.
cv-квалификация указателя должна быть такой же. cv-квалификация класса на который указываем/ссылаемся в Ss-версии должна быть такой же, как и в Fs-версии или более слабой.
cv-квалификация - это const volatile квалификация.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
IvanoffAndrey
Дата 16.9.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 8.7.2006
Где: СГАУ

Репутация: нет
Всего: 2



Мда, неожиданно. archimed7592 - держи плюс.

Добавлено @ 18:03

Ну почему стандарт на русский не переведут????
Или хотя бы оглавление стандарта.
Книжки всякие дебильные переводят, а стандарт нет. Что им трудно в виде книги выпустить или хелпа?
Все спасибо вопрос закрыт.



Это сообщение отредактировал(а) IvanoffAndrey - 16.9.2007, 18:10
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
archimed7592
Дата 16.9.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(IvanoffAndrey @  16.9.2007,  17:59 Найти цитируемый пост)
Ну почему стандарт на русский не переведут????
Или хотя бы оглавление стандарта.
Книжки всякие дебильные переводят, а стандарт нет. Что им трудно в виде книги выпустить или хелпа?

А смысл? Если ты не знаешь английский - стандарт не для тебя. В программировании без английского никуда.
Тем более, что и так немаленький стандарт в русском переводе получиться ещё больше(на русском невозможно так точно и лаконично формулировать утверждения).

К слову, английский люблю больше чем С++ smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Daevaorn
Дата 16.9.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(archimed7592 @  16.9.2007,  20:43 Найти цитируемый пост)
Тем более, что и так немаленький стандарт в русском переводе получиться ещё больше

А главное доберет ещё неточностей, которых и так там хватает.
PM MAIL WWW   Вверх
IvanoffAndrey
Дата 16.9.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 8.7.2006
Где: СГАУ

Репутация: нет
Всего: 2



Тем не менее, я думаю что всетаки не помешало бы.
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
archimed7592
Дата 17.9.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(IvanoffAndrey @  16.9.2007,  20:55 Найти цитируемый пост)
Тем не менее, я думаю что всетаки не помешало бы. 

Не ты один так думаешь smile. Вот энтузиаст, который "почти" перевёл стандарт.

Он кстати ответ на мой давнишний комментарий о бессмыслености перевода зачем-то оформил как отдельный пост, который сейчас на главной странице... Только сейчас набрёл smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Earnest
Дата 17.9.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(IvanoffAndrey @  16.9.2007,  18:34 Найти цитируемый пост)
Т.е. Тип возвращаемого значения вирутальной функции можно сменить с Fs<T> & на Ss<T> & (при виртуальности префиксного оператора), а вот с Fs<T> const на Ss<T> const  нельзя? 
Ну это вооще же неочевидно.

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



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.