C++ statische Polymorphie (CRTP) und die Verwendung von typedefs von abgeleiteten Klassen

Lese ich die Wikipedia-Artikel über den neugierig-recurring template pattern in C++ tut für statische (read: compile-Zeit) - Polymorphismus. Ich wollte zu verallgemeinern, so dass ich ändern könnte, die Rückgabetypen der Funktionen, basierend auf den abgeleiteten Typ. (Dies scheint, wie es sollte möglich sein, da die base-Typ kennt die abgeleitete Typ von der template-parameter). Leider ist der folgende code wird nicht kompiliert mit MSVC 2010 (ich weiß nicht, haben Sie einfachen Zugang zu gcc jetzt, so dass ich habe nicht versucht es noch). Wer weiß, warum?

template <typename derived_t>
class base {
public:
    typedef typename derived_t::value_type value_type;
    value_type foo() {
        return static_cast<derived_t*>(this)->foo();
    }
};

template <typename T>
class derived : public base<derived<T> > {
public:
    typedef T value_type;
    value_type foo() {
        return T(); //return some T object (assumes T is default constructable)
    }
};

int main() {
    derived<int> a;
}

BTW, ich habe einen work-around mit extra-template-Parameter, aber ich weiß nicht wie es---es wird sehr ausführlich bei der übergabe viele Arten die Vererbungskette.

template <typename derived_t, typename value_type>
class base { ... };

template <typename T>
class derived : public base<derived<T>,T> { ... };

EDIT:

Die Fehlermeldung, dass MSVC 2010 gibt in dieser situation ist error C2039: 'value_type' : is not a member of 'derived<T>'

g++ 4.1.2 (via codepad.org) sagt error: no type named 'value_type' in 'class derived<int>'

  • Nur damit Sie wissen, codepad.org kompilieren und ausführen von code für Sie, und ich glaube, es verwendet den gcc/g++. So sind Sie nie außerhalb der Reichweite von g++ 🙂
  • könntest du welche Fehler sind Sie immer so, dass ich nützlich sein für die Leser.
  • Ideone verwendet gcc sicher, es ist also noch einer 🙂
  • vielen Dank für den Tipp über codepad.org! @Sriram: Guter Anruf. Ich fügte Sie.
Schreibe einen Kommentar