Le paramètre de ma classe A devra toujours être une implémentation du template B ou une classe dérivée.
Je vois deux problèmes : premièrement, dans ce code, rien n'oblige à ce que le paramètre T de A soit de type B.
Regarde chez boost, ils proposent pas mal de choses pour arriver a ce resultat: http://www.boost.org/libs/libraries.htm#Generic (concept checks, static assert + type traits)
Deuxièment, ça ne compile pas ;-)
Ca devrait etre seulement lie au typename manquant.
Bertrand.
Frédéric Mayot wrote:
template <typename T>
class B
{
public:
typedef int truc;
};
template <class T>
class A
{
public:
T::truc t;
Ici, il manque un typename pour indiquer que le nom qualifie "truc" qui
depend du parametre template T est un type:
Le paramètre de ma classe A devra toujours être une implémentation du
template B ou une classe dérivée.
Je vois deux problèmes : premièrement, dans ce code, rien n'oblige à ce
que le paramètre T de A soit de type B.
Regarde chez boost, ils proposent pas mal de choses pour arriver a ce
resultat:
http://www.boost.org/libs/libraries.htm#Generic
(concept checks, static assert + type traits)
Deuxièment, ça ne compile pas ;-)
Ca devrait etre seulement lie au typename manquant.
Le paramètre de ma classe A devra toujours être une implémentation du template B ou une classe dérivée.
Je vois deux problèmes : premièrement, dans ce code, rien n'oblige à ce que le paramètre T de A soit de type B.
Regarde chez boost, ils proposent pas mal de choses pour arriver a ce resultat: http://www.boost.org/libs/libraries.htm#Generic (concept checks, static assert + type traits)
Deuxièment, ça ne compile pas ;-)
Ca devrait etre seulement lie au typename manquant.
Bertrand.
Vianney Lançon
Le Tue, 09 Dec 2003 22:43:51 +0100, dans fr.comp.lang.c++, Frédéric Mayot a dit :
Bonjour,
J'ai un petit problème avec le code suivant :
template <typename T> class B { public: typedef int truc; };
template <class T> class A { public: T::truc t; };
Le paramètre de ma classe A devra toujours être une implémentation du template B ou une classe dérivée.
Je vois deux problèmes : premièrement, dans ce code, rien n'oblige à ce que le paramètre T de A soit de type B. Deuxièment, ça ne compile pas ;-)
En règlant le premier problème, je pense que le second sera également résolu (?)
template <typename T> class B { public: static const bool sm_inheritFromB = true; public: typedef int truc; };
template <class T> class A { typdef typename T::truc Data; public: A() { COMPIL_TIME_ASSERT( T::sm_inheritFromB && "T must inherit from B"); } Data t; };
int main(int argv, char** argc) { A< B<int> > a;
return 1; }
Tu implementes COMPIL_TIME_ASSERT en spécialisant une template pour les valeurs true et false. Si ça passe tu n'as pas de code suplémentaire généré. Si ça passe pas tu as un message d'erreur explicite à la compilation.
-- Vianney LANÇON radix omnia malorum prematurae optimisatia est -- Donald Knuth
Le Tue, 09 Dec 2003 22:43:51 +0100, dans fr.comp.lang.c++,
Frédéric Mayot a dit :
Bonjour,
J'ai un petit problème avec le code suivant :
template <typename T>
class B
{
public:
typedef int truc;
};
template <class T>
class A
{
public:
T::truc t;
};
Le paramètre de ma classe A devra toujours être une implémentation du
template B ou une classe dérivée.
Je vois deux problèmes : premièrement, dans ce code, rien n'oblige à ce
que le paramètre T de A soit de type B. Deuxièment, ça ne compile pas ;-)
En règlant le premier problème, je pense que le second sera également
résolu (?)
template <typename T>
class B
{
public:
static const bool sm_inheritFromB = true;
public:
typedef int truc;
};
template <class T>
class A
{
typdef typename T::truc Data;
public:
A() {
COMPIL_TIME_ASSERT( T::sm_inheritFromB && "T must inherit from B");
}
Data t;
};
int main(int argv, char** argc)
{
A< B<int> > a;
return 1;
}
Tu implementes COMPIL_TIME_ASSERT en spécialisant une template pour
les valeurs true et false.
Si ça passe tu n'as pas de code suplémentaire généré.
Si ça passe pas tu as un message d'erreur explicite à la compilation.
--
Vianney LANÇON
radix omnia malorum prematurae optimisatia est
-- Donald Knuth
Le paramètre de ma classe A devra toujours être une implémentation du template B ou une classe dérivée.
Je vois deux problèmes : premièrement, dans ce code, rien n'oblige à ce que le paramètre T de A soit de type B. Deuxièment, ça ne compile pas ;-)
En règlant le premier problème, je pense que le second sera également résolu (?)
template <typename T> class B { public: static const bool sm_inheritFromB = true; public: typedef int truc; };
template <class T> class A { typdef typename T::truc Data; public: A() { COMPIL_TIME_ASSERT( T::sm_inheritFromB && "T must inherit from B"); } Data t; };
int main(int argv, char** argc) { A< B<int> > a;
return 1; }
Tu implementes COMPIL_TIME_ASSERT en spécialisant une template pour les valeurs true et false. Si ça passe tu n'as pas de code suplémentaire généré. Si ça passe pas tu as un message d'erreur explicite à la compilation.
-- Vianney LANÇON radix omnia malorum prematurae optimisatia est -- Donald Knuth