OVH Cloud OVH Cloud

Template et params

2 réponses
Avatar
Frédéric Mayot
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;
};

int main(int argv, char** argc)
{
A<B<int> > a;
return 1;
}

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 (?)

Merci.

Fred

2 réponses

Avatar
Bertrand Motuelle
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:

public:
typename T::truc t;

};

int main(int argv, char** argc)
{
A<B<int> > a;
return 1;
}

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.

Avatar
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;
};

int main(int argv, char** argc)
{
A<B<int> > a;
return 1;
}

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