8

Edycja: Znaleziono duplicatetypedef dziedziczenie z czystego abstrakcyjnego bazy

Mam stopniała jakiś kod problemu w najprostszym przypadku pracy zilustrować następujący: mój typedef w czystej abstrakcyjnej klasy bazowej nie jest dziedziczona przez Klasy pochodnej. W kodzie poniżej chciałbym odziedziczyć system_t typedef do ConcreteTemplateMethod:

#include <iostream> 

// pure abstract template-method 
template <typename T> // T == Analyzer<U> 
class TemplateMethod { 
    public: 
    typedef T system_t; 

    virtual void fn (const system_t& t) const = 0; 
}; 


template <typename T> 
class Analyzer { 
    public: 
    void TemplatedAlgorithm (const TemplateMethod< Analyzer <T> >& a) const { 
     printf ("Analyzer::TemplatedAlgorithm\n"); 
     a.fn(*this); // run the template-method 
    } 

    void fn() const { 
     printf ("Analyzer::fn\n"); 
    } 
}; 


// concrete template-method 
template <typename T> 
class ConcreteTemplateMethod : public TemplateMethod < Analyzer<T> > { 
    public: 
    typedef Analyzer<T> system_t; 

    virtual void fn (const system_t& t) const { 
     printf ("ConcreteTemplateMethod::fn\n"); 
     t.fn(); // perform Analyzer's fn 
    } 
}; 

int main() { 

    Analyzer <double> a; 
    ConcreteTemplateMethod<double> dtm; 
    a.TemplatedAlgorithm(dtm); 

    return 0; 
} 

Ten kod kompiluje i działa zgodnie z oczekiwaniami. W ConcreteTemplateMethod następujące jest wymagane, i po usunięciu przyczyny błędów kompilatora:

typedef Analyzer<T> system_t; 

uwagę, że typ system_t jest już typedef „ed w klasie bazowej, jednak. Dlaczego muszę uwzględnić inny typedef podczas dziedziczenia?

Zdaję sobie sprawę, że mogę zakwalifikować TypeName z system_t w pochodzącej ConcreteTemplateMethod za pomocą typename TemplateMethod< Analyzer<T> >::system_t&, ale to nieco rozwlekły, i chciałbym, aby uniknąć konieczności ponownego typedef do podstawy Everytime I dziedziczą i trzeba użyć to samo system_t. Czy istnieje sposób, który można zdefiniować w bazie TemplateMethod?

+0

Nie, nie możesz tego zrobić bezpośrednio. można jednak utworzyć makro, które to zrobi. – Anycorn

+0

możliwy duplikat [Dziedziczenie i szablony w C++ - dlaczego metody są niewidoczne?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-meteths-visible) –

Odpowiedz

8

należy zrobić

typedef typename TemplateMethod<X>::system_t system_t; 

do "dziedziczenia" typedef. typedef nie jest automatycznie dziedziczony (jeśli kompilator jest zgodny).

Jeśli spojrzysz przez przepełnienie stosu, gdzieś pojawi się duplikat tego pytania.