J'ai lu l' article de Wikipedia sur l'curieusement récurrents pattern template en C++ pour faire du statique (lire: au moment de la compilation) le polymorphisme. Je voulais généraliser afin que je puisse changer le type de retour des fonctions basées sur le type dérivé. (Il semble que ce devrait être possible, étant donné le type de base connaît le type dérivé à partir du paramètre de modèle). Malheureusement, le code suivant ne compile pas à l'aide de MSVC 2010 (je n'ai pas un accès facile à la gcc en ce moment donc je n'ai pas encore essayé). Quelqu'un sait pourquoi?
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, j'ai un travail autour de l'aide supplémentaire des paramètres de modèle, mais je ne l'aime pas---il sera très bavard lors du passage de nombreux types de la chaîne d'héritage.
template <typename derived_t, typename value_type>
class base { ... };
template <typename T>
class derived : public base<derived<T>,T> { ... };
EDIT:
Le message d'erreur que MSVC 2010 donne dans cette situation est - error C2039: 'value_type' : is not a member of 'derived<T>'
g++ 4.1.2 (via codepad.org), dit - error: no type named 'value_type' in 'class derived<int>'