Chi sta risolvendo il problema ora, quando un metodo template in una classe template non viene trovato dal compilatore per qualche motivo e si verifica un errore?
no one of overloads can be applied to the function call
?
I compilatori C in questi casi scrivono specificamente quali tipi sono stati sostituiti e quali funzioni con quale prototipo non vengono trovate, quindi è più o meno chiaro quale sia il problema, ma qui - nessuna specifica.
Vorrei vedere la regola esatta: quando ho il diritto di sovrascrivere una funzione virtuale con un diverso tipo di valore di ritorno?
Solo un singolo caso, quando si restituisce un puntatore a un oggetto di classe, quando il tipo di ritorno della funzione sovrascritta eredita (è il primo genitore nell'ereditarietà multipla, non ancora supportata in MQL) dal tipo che la funzione sovrascritta restituisce.
Ilyas: Hai un errore nel tuo esempio - nessuna eredità di D da C
Sì, errore mio, scusa.
class A {};
class B : A {};
class C {
virtual B *f() { returnNULL; }
};
class D : C {
virtual A *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C;
class A {
virtual A *f() { returnNULL; }
};
class B : A {
virtual C *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C : B {
virtual C *f() { returnNULL; } //нормально
};
Nonostante l'errore (perché non ci sarà alcuna generazione di eseguibile), la funzione B::f sovrascrive A::f, quindi non c'è alcun errore di sovrascrittura per C::f.
Ilyas: Nonostante l'errore (perché non ci sarà alcuna generazione di eseguibile), la funzione B::f sovrascrive A::f, quindi non c'è alcun errore di sovrascrittura per C::f.
Non ho capito bene l'idea, ma è quasi lo stesso
class C;
class A {
virtual A *f() { returnNULL; }
};
class B : A {
virtual C *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C : A {};
class C;
class A {
virtual A *f() { returnNULL; }
};
class C : A {};
class B : A {
virtual C *f() { returnNULL; } //нормально
};
C'è un errore in un caso e nessun errore nell'altro. E ho appena scambiato le linee
Chi sta risolvendo il problema ora, quando un metodo template in una classe template non viene trovato dal compilatore per qualche motivo e si verifica un errore?
no one of overloads can be applied to the function call
?
I compilatori C in questi casi scrivono specificamente quali tipi sono stati sostituiti e quali funzioni con quale prototipo non vengono trovate, quindi è più o meno chiaro quale sia il problema, ma qui - nessuna specifica.
Lo abbiamo fatto deliberatamente, poiché non c'è nessun problema con l'eredità diretta.
Vorrei vedere la regola esatta: quando ho il diritto di sovrascrivere una funzione virtuale con un diverso tipo di valore di ritorno?
O è un sovraccarico?
Vorrei vedere la regola esatta: quando ho il diritto di sovrascrivere una funzione virtuale con un diverso tipo di valore di ritorno?
Grazie. Tutto ha un senso.
...quando il tipo di ritorno di una funzione sovrascritta è ereditato... dal tipo restituito da quello sovrascritto.
E se fosse il contrario?
E se fosse il contrario?
Hai un errore nel tuo esempio - nessuna eredità di D da C
Sì, errore mio, scusa.
Un altro esempio controverso:
Un altro esempio controverso:
Nonostante l'errore (perché non ci sarà alcuna generazione di eseguibile), la funzione B::f sovrascrive A::f, quindi non c'è alcun errore di sovrascrittura per C::f.
Non ho capito bene l'idea, ma è quasi lo stesso
C'è un errore in un caso e nessun errore nell'altro. E ho appena scambiato le linee