Instanciation de templates
Je pensais que lorsqu'on instanciais une classe template, toutes les fonctions membres (et non membres) de cette classe etaient alors declarees.
Mais cela n'est visiblement pas le cas avec le code suivant ou la fonction membre "constraints" de la classe "IsDerivedFrom" comporte une erreur qui n'est pas vue a la compil alors qu'un objet de type "IsDerivedFrom" est bien cree :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
class Base {};
class Derivee : public Base {};
template <typename D, typename B>
class IsDerivedFrom
{
private:
void constraints(D* p);
protected:
IsDerivedFrom() {}
};
template <typename D, typename B>
void IsDerivedFrom<D, B>::constraints(D* p)
{
B* pb(p);
pb = 1; // erreur non detectee a la compil ...
}
template <typename T>
class Widget : public IsDerivedFrom<T, Base>
{};
int main()
{
Widget<Derivee> w;
} |
Voila, ma question est simple, pourquoi l'erreur dans la fonction constraints n'est pas detectee a la compil alors qu'un objet de type Widget (qui derive de IsDerivedFrom) est bien instancie ?