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.

[Eliminato]  
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.
[Eliminato]  

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