Ошибки, баги, вопросы - страница 1639

 

Кто какими способами решает сейчас проблему, когда шаблонный метод в шаблонном классе почему-то не находится компилятором и возникает ошибка:

no one of overloads can be applied to the function call

?

Сишные компиляторы в таких случаях пишут конкретно какие типы подставлялись и каких функций с каким прототипом не нашлось, поэтому более или менее понятно в чем проблема, а здесь - конкретики нет.

 
Ilyas:
Это сделано нами осознанно, так как никаких проблем при наличии прямого наследования нет.

Хотелось бы увидеть точное правило: в каких случаях я имею право переопределить виртуальную функцию с другим типом возвращаемого значения?

 Или это перегрузка?

 
Koldun Zloy:

Хотелось бы увидеть точное правило: в каких случаях я имею право переопределить виртуальную функцию с другим типом возвращаемого значения?

Только один единственный случай, при возврате указателя на объект класса, когда возвращаемый тип переопределённой функции наследуется (является первым родителем при множественном наследовании, пока не поддерживается в MQL) от типа, который возвращает переопределяемая.
 

Спасибо. Всё понятно.

 
Ilyas:
.. когда возвращаемый тип переопределённой функции наследуется ... от типа, который возвращает переопределяемая.

А если наоборот?

class A {};
class B : public A {};
class C {
        virtual B *f() { return NULL; }
};
class D {
        virtual A *f() { return NULL; } //нормально
};
 
A100:

А если наоборот?

У Вас ошибка в примере - нет наследования D от C
 
Ilyas:
У Вас ошибка в примере - нет наследования D от C

Да, ошибся, извините

class A {};
class B : A {};
class C {
        virtual B *f() { return NULL; }
};
class D : C {
        virtual A *f() { return NULL; } //Error: overriding virtual function with different return type
};
 

Другой противоречивый пример:

class C;
class A {
        virtual A *f() { return NULL; }
};
class B : A {
        virtual C *f() { return NULL; } //Error: overriding virtual function with different return type
};
class C : B {
        virtual C *f() { return NULL; } //нормально
};
 
A100:

Другой противоречивый пример:

Несмотря на ошибку (ведь генерации исполняемого файла не будет), функция B::f переопределяет A::f, поэтому ошибки переопределения для C::f нет.
 
Ilyas:
Несмотря на ошибку (ведь генерации исполняемого файла не будет), функция B::f переопределяет A::f, поэтому ошибки переопределения для C::f нет.

Не совсем понял мысль, но почти то же самое

class C;
class A {
        virtual A *f() { return NULL; }
};
class B : A {
        virtual C *f() { return NULL; } //Error: overriding virtual function with different return type
};
class C : A {};
class C;
class A {
        virtual A *f() { return NULL; }
};
class C : A {};
class B : A {
        virtual C *f() { return NULL; } //нормально
};
В одном случае ошибка, в другом - нет. А я просто поменял строки местами
Причина обращения: