4 votes

Accéder au typedef enfant à partir du parent templatized

Pourquoi cela ne compile-t-il pas?

template  struct Base
{
    typename Child::Type t; // Ne compile pas. "Pas de type nommé Type dans Child"
};

struct Derived : public Base
{
    typedef int Type;
};

Comment se fait-il que Base ne puisse pas accéder au Type de son enfant? J'ai essayé la même chose avec une fonction statique au lieu d'un typedef, et cela fonctionne très bien.

J'ai essayé à la fois GCC 4.4.2 et clang 3.0.

1voto

stinky472 Points 4864

Ce genre de code ne fonctionnera pas car Derived n'est pas encore entièrement défini au moment où Base est instancié. Ce sera essentiellement un type incomplet.

Les alternatives peuvent aller du simple au très complexe. Probablement le moyen le plus simple, si vous le pouvez, est d'éviter de travailler avec Child::Type jusqu'à ce que vous en ayez réellement besoin (évaluation paresseuse, essentiellement). Il serait utile si vous précisiez exactement ce que vous voulez réaliser.

1voto

111111 Points 8668

En complément de la réponse de stinky472, si votre base dépend d'avoir un Type, alors vous pourriez faire bien pire que

template
struct base
{
     Type t;
};

   struct Derived : public Base
{
};

Cependant, ce n'est pas aussi propre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X