downcast bei template-Klassen
-
Hi
kann mir mal sagen warum folgender nicht funktioniert:
template <typename S, typename T> class F { public: F() {} inline virtual T operator() (const S& x) {...} }; template <typename S1, typename S2, typename T1, typename T2> class FP : public F<pair<S1,S2>,pair<T1,T2> > { public: FP() : F<pair<S1,S2>,pair<T1,T2> > () {} pair<T1,T2> operator() (const pair<S1,S2>& x) {...} pair<T1,T2> Test (const pair<S1,S2>& x) {...} }; void Test() { F<int,int> g; F<double,double> f; FP<double,int,double,int> fg; F< pair<double,int> , pair<double,int> > *p_fg_ptr = new F< pair<double,int> , pair<double,int> > (fg); if (p_fg_ptr==0) cout << "ALARM!!" << endl; FP<double,int,double,int>* fg2 = dynamic_cast<FP<double,int,double,int>* > (p_fg_ptr) ; if (fg2==0) cout << "ALARM!! !!" << endl;
In Kurzfrom: F ist ein Template mit 2 Parametern, FP ist eine spezialisierung von F auf paarweise parameter ... erbt demzufolge von F.
Der (implizite) upcast funktioniert, der explizite downcast nicht ... der loest ALARM aus ...Warum geht das nicht? Mit einfachen (nicht-template) Klassen geht es glaube ich.
Viele Gruesse und vielen Dank
-
FP ist keine Spezialisierung von FP, sondern einfach eine Klasse (in diesem Fall zufällige ein Template) die F<...> als Basisklasse hat.
In Deinem Code wird kein FP in ein F gecastet. Mit new instanzierst du ein F. Auch wenn die konkreten Parameter vom Typ std:pair<...> sind. Das heißt p_fg_ptr zeigt immer nur auf ein Objekt der Basisklasse F und das kann natürlich nicht in ein FP gecastet werden.DJohn