Errori, bug, domande - pagina 1639

 

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.

 
Ilyas:
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?

 
Koldun Zloy:

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.
 

Grazie. Tutto ha un senso.

 
Ilyas:
...quando il tipo di ritorno di una funzione sovrascritta è ereditato... dal tipo restituito da quello sovrascritto.

E se fosse il contrario?

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

E se fosse il contrario?

Hai un errore nel tuo esempio - non c'è eredità di D da C
 
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() { return NULL; }
};
class D : C {
        virtual A *f() { return NULL; } //Error: overriding virtual function with different return type
};
 

Un altro esempio 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:

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.
 
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() { 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; } //нормально
};
C'è un errore in un caso e nessun errore nell'altro. E ho appena scambiato le linee