 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Laurent Rineau Guest
|
Posted: Mon Aug 23, 2004 10:02 pm Post subject: Curiously reccuring template patterns, et types |
|
|
(Ceci est mon premier message dans fr.comp.lang.c, et même sur Usenet en
général.)
On peut faire ce genre de choses en C++ :
template <typename Model>
struct Concept {
Model& self()
{
return static_cast<Model&>(*this);
}
void f()
{
self.f_impl();
}
};
struct Model: public Concept<Model>
{
void f_impl() {};
};
Ainsi, Model::f() est une fonction de la superclass Concept dont le
comportement dépend de la classe dérivée Model. C'est décrit dans [1] (si
d'ailleurs quelqu'un peut me dire comment lire ce genre de chose, il faut
être abonné ?).
Bizarrement, on ne peut pas faire en sorte que Concept utilise un type
défini dans Model :
template <typename Model>
struct Concept {
Model& self()
{
return static_cast<Model&>(*this);
}
typedef typename Model::f_return_type f_type; // ligne 9
f_type f()
{ // ligne 12
return self.f_impl();
}
};
struct Model: public Concept<Model> // ligne 17
{ // ligne 18
typedef int f_return_type;
f_return_type f_impl() { return 0; };
};
J'obtiens les erreurs suivantes :
essai2.C: In instantiation of `Concept<Model>':
essai2.C:18: instantiated from here
essai2.C:9: invalid use of undefined type `struct Model'
essai2.C:17: forward declaration of `struct Model'
essai2.C:12: invalid use of undefined type `struct Model'
essai2.C:17: forward declaration of `struct Model'
Quelqu'un sait-il pourquoi exactement ? La définition de Model provoque
l'instanciation de Concept<Model>. Alors que, bizarrement, le fait que
Model::f_impl() soit défini après la ligne 18 ne gène pas le compilateur,
le fait que Model::f_return_type le soit semble provoquer
l'erreur. Pourquoi cette différence ?
[1] Coplien J.: "Curiously reccuring template patterns", The C++ Report,
Vol.7, No.2, Feb.1995, pp.24-27.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|