Hatalar, hatalar, sorular - sayfa 1639

 

Şimdi sorunu kim hangi yollarla çözüyor, bir nedenden dolayı şablon sınıfındaki şablon yöntemi derleyici tarafından bulunamadığında ve bir hata oluştuğunda:

no one of overloads can be applied to the function call

?

Bu gibi durumlarda Sish derleyicileri, hangi türlerin değiştirildiğini ve hangi prototiplerin bulunmadığını özellikle yazar, bu nedenle sorunun ne olduğu az çok açıktır, ancak burada hiçbir özellik yoktur.

 
Ilyas :
Doğrudan kalıtımla ilgili herhangi bir sorun olmadığı için bu bizim tarafımızdan bilinçli olarak yapıldı.

Kesin kuralı görmek istiyorum: Hangi durumlarda farklı bir dönüş türüyle sanal bir işlevi yeniden tanımlama hakkım var?

Yoksa aşırı yük mü?

 
Koldun Zloy :

Kesin kuralı görmek istiyorum: Hangi durumlarda farklı bir dönüş türüyle sanal bir işlevi yeniden tanımlama hakkım var?

Bir sınıf nesnesine bir işaretçi döndürürken, geçersiz kılınan işlevin dönüş türü geçersiz kılınan işlevin döndürdüğü türden devralındığında (çoklu kalıtımdaki ilk ebeveyndir, henüz MQL'de desteklenmemektedir) yalnızca tek bir durum.
 

Teşekkür ederim. Temiz.

 
Ilyas :
.. geçersiz kılınan bir işlevin dönüş türü devralındığında ... geçersiz kılınan işlevin döndürdüğü türden.

Ya tersi olursa?

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

Ya tersi olursa?

Örnekte bir hatanız var - D'nin C'den mirası yok
 
Ilyas :
Örnekte bir hatanız var - D'nin C'den mirası yok

Evet, yanılmışım, üzgünüm.

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

Bir başka tartışmalı örnek:

 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 :

Bir başka tartışmalı örnek:

Hataya rağmen (çünkü yürütülebilir bir dosya oluşturulmayacaktır), B::f işlevi A::f'yi yeniden tanımlar, bu nedenle C::f için yeniden tanımlama hatası yoktur.
 
Ilyas :
Hataya rağmen (çünkü yürütülebilir bir dosya oluşturulmayacaktır), B::f işlevi A::f'yi yeniden tanımlar, bu nedenle C::f için yeniden tanımlama hatası yoktur.

Konuyu tam anlayamadım ama hemen hemen aynı

 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 ; } //нормально
};
Bir durumda yanlış, diğerinde değil. sadece satırları değiştirdim