8
votes

Taille d'échec dans le modèle, même si les types sont tous définis

OK, je travaille avec G ++ 4.8.2 et j'ai le code suivant (un peu long) qui obtient un message d'erreur sur un type incomplet. J'ai réduit le code à un petit morceau d'inclusion ici et peut être compilé directement: xxx

Le message d'erreur du compilateur est: xxx

De toute évidence, le fonctionnement du modèle est défini ci-dessus et tous les arguments au fonctionnement ont été explicitement définis. Cela semble m'impliquer que la fonction de taille de la taille doit être bien définie. Y a-t-il quelque chose qui me manque ici?

- Ron


0 commentaires

4 Réponses :


0
votes

Je ne pense pas que vous puissiez le faire, car vous avez une définition récursive. Par exemple, vous ne pouvez pas faire cela:

#include <cstdlib>

class B;

class A
{
    B b;
};

class B
{
    A a;
};

int main()
{
        A x;
}


0 commentaires

1
votes

Votre définition de Foncteur est récursif. Il faut que le compilateur connaisse la taille du type de Foncteur lors de la détermination du type de foncteur . Vous pouvez générer exactement le même problème avec ce code: xxx

Selon votre application, vous devriez pouvoir faire ce que vous voulez utiliser avec Type Traits .


2 commentaires

Je pensais que les membres de données statiques ne contribueraient pas à la taille d'une classe, donc il ne devrait pas y avoir de récursivité ici ...


Peu importe que la taille de la classe sera éventuellement. Au moment où vous déclarez le membre statique, le compilateur ne sait pas quelle est la taille de la classe, car elle n'a pas fini de déclarer la classe.



1
votes

au moment où vous déclarez piscine intérieure de Foncteur , vous définissez toujours la classe classe Le type foncteur est toujours incomplet.

Ceci est similaire aux déclarations avant: xxx


0 commentaires

6
votes

Le problème est que le compilateur tente d'instancer MemPool code> avant son instanciation Foncteur code>. En effet, le compilateur estime qu'il doit être capable de définir le membre statique Foncteur :: piscine code> avant Foncteur code> est considéré comme entièrement défini.

Une solution de contournement consiste à renvoyer un mempool & code> à partir d'une fonction de membre statique. P>

template <class obj, class mthd>
class functor
{
private:
  static mempool<functor> & get_pool () {
    static mempool<functor> pool;
    return pool;
  }
};

//template <class obj, class mthd>
//mempool<functor<obj, mthd> > functor<obj, mthd>::pool;


0 commentaires