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


Log in to reply