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: Le message d'erreur du compilateur est: p> 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? P> - Ron P> P>
4 Réponses :
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; }
Votre définition de Selon votre application, vous devriez pouvoir faire ce que vous voulez utiliser avec Type Traits . P> P> Foncteur code> est récursif. Il faut que le compilateur connaisse la taille du type de code> Foncteur code> lors de la détermination du type de foncteur code>. Vous pouvez générer exactement le même problème avec ce code:
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.
au moment où vous déclarez Ceci est similaire aux déclarations avant: p> piscine code> intérieure em> de
Foncteur code>, vous définissez toujours la classe code> classe code> Le type
foncteur code> est toujours incomplet.
Le problème est que le compilateur tente d'instancer Une solution de contournement consiste à renvoyer un 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.
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;