Erros, bugs, perguntas - página 1639

 

Quem está a resolver o problema agora, quando um método de modelo numa classe de modelo não é encontrado pelo compilador por alguma razão e ocorre um erro?

no one of overloads can be applied to the function call

?

Os compiladores C em tais casos escrevem especificamente que tipos foram substituídos e que funções com que protótipo não são encontrados, por isso é mais ou menos claro qual é o problema, mas aqui - não há especificações.

 
Ilyas:
Fizemo-lo deliberadamente, uma vez que não há qualquer problema com a herança directa.

Gostaria de ver a regra exacta: quando é que tenho o direito de anular uma função virtual com um tipo diferente de valor de retorno?

Ou é uma sobrecarga?

 
Koldun Zloy:

Gostaria de ver a regra exacta: quando é que tenho o direito de anular uma função virtual com um tipo diferente de valor de retorno?

Apenas um único caso, ao devolver um ponteiro a um objecto de classe, quando o tipo de retorno da função de overridden herda (é o primeiro pai em herança múltipla, ainda não suportado em MQL) do tipo que o overridden devolve.
 

Obrigado. Tudo isto faz sentido.

 
Ilyas:
...quando o tipo de retorno de uma função anulada é herdado ... do tipo devolvido pelo anulado.

E se for o contrário?

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

E se for o contrário?

Tem um erro no seu exemplo - não há herança de D de C
 
Ilyas:
Tem um erro no seu exemplo - não há herança de D de C

Sim, erro meu, desculpem.

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

Outro exemplo controverso:

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:

Outro exemplo controverso:

Apesar do erro (porque não haverá geração executável), a função B::f anula A::f, pelo que não há erro de anulação para C::f.
 
Ilyas:
Apesar do erro (porque não haverá geração executável), a função B::f anula A::f, pelo que não há erro de anulação para C::f.

Não percebo bem a ideia, mas é quase a mesma

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; } //нормально
};
Há um erro num caso e nenhum erro no outro. E eu apenas troquei as linhas