Errores, fallos, preguntas - página 1639

 

¿Quién resuelve el problema ahora, cuando un método de plantilla en una clase de plantilla no es encontrado por el compilador por alguna razón y se produce un error?

no one of overloads can be applied to the function call

?

Los compiladores de C en tales casos escriben específicamente qué tipos fueron sustituidos y qué funciones con qué prototipo no se encuentran, por lo que está más o menos claro cuál es el problema, pero aquí - no hay detalles.

 
Ilyas:
Lo hicimos deliberadamente, ya que no hay problemas con la herencia directa.

Me gustaría ver la regla exacta: ¿cuándo tengo derecho a anular una función virtual con un tipo diferente de valor de retorno?

¿O es una sobrecarga?

 
Koldun Zloy:

Me gustaría ver la regla exacta: ¿cuándo tengo derecho a anular una función virtual con un tipo diferente de valor de retorno?

Sólo un único caso, al devolver un puntero a un objeto de clase, cuando el tipo de retorno de la función anulada hereda (es el primer padre en la herencia múltiple, aún no soportada en MQL) del tipo que devuelve la anulada.
 

Gracias. Todo tiene sentido.

 
Ilyas:
...cuando se hereda el tipo de retorno de una función anulada... del tipo devuelto por el anulado.

¿Y si es al revés?

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

¿Y si es al revés?

Tienes un error en el ejemplo - no hay herencia de D desde C
 
Ilyas:
Tienes un error en tu ejemplo - no hay herencia de D desde C

Sí, mi error, lo siento.

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
};
 

Otro ejemplo controvertido:

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:

Otro ejemplo controvertido:

A pesar del error (porque no habrá generación de ejecutables), la función B::f anula a A::f, por lo que no hay error de anulación para C::f.
 
Ilyas:
A pesar del error (porque no habrá generación de ejecutables), la función B::f anula a A::f, por lo que no hay error de anulación para C::f.

No entiendo bien la idea, pero es casi lo mismo

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; } //нормально
};
Hay un error en un caso y ningún error en el otro. Y acabo de intercambiar las líneas