Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Перегрузка инкремента?


Автор: IvanoffAndrey 16.9.2007, 16:54
Здравствуйте. Данная тема уже поднималась на этом форуме. 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 ++'

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

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

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

Потомо что идет перекрытие унаследованного оператора, но при этом у наследника возвращаемый тип другой.

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

Проблем в коде две:
1. Приватные конструкторы класса Ss (название вполне бессмысленное)
2. Операторы имеют разный тип возвращаемого значения и не могут быть перегружены. Делать их виртуальными потому бессмысленно. Можно применить маленькую хитрость описанную в "уже поднятой теме"

Автор: IvanoffAndrey 16.9.2007, 17:34
Цитата

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

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

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

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


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

http://www.kuzbass.ru/docs/isocpp/derived.html#class.virtual
пункт 5

Автор: IvanoffAndrey 16.9.2007, 17:48
Цитата

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).


Плиз переведите в кратце о чем говорится. А то я что то пасую перед этим текстом. Знаний англицкого не хватает.

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

Автор: IvanoffAndrey 16.9.2007, 17:59
Мда, неожиданно. archimed7592 - держи плюс.

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

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


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

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

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

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

А главное доберет ещё неточностей, которых и так там хватает.

Автор: IvanoffAndrey 16.9.2007, 20:55
Тем не менее, я думаю что всетаки не помешало бы.

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

Не ты один так думаешь smile. Вот http://zouev.blogspot.com/2007/06/blog-post_20.html, который "почти" перевёл стандарт.

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)