2010-03-29 5 views
2

Je reçois une erreur de type incomplète lorsque j'essaie de compiler mon code. Je sais que c'est lié à includes, mais mon projet est grand et il utilise plusieurs templates donc je ne peux pas trouver quel type est réellement incomplet. Le message d'erreur n'aide pas non plus:Résolution d'une erreur de type incomplète difficile

Compiling: ../../../addons/ofxTableGestures/src/Graphics/objects/CursorFeedback.cpp 
In file included from ../../../addons/ofxTableGestures/ext/boost/fusion/include/invoke_procedure.hpp:10, 
       from ../../../addons/ofxTableGestures/src/oscGestures/tuioApp.hpp:46, 
       from /home/thechaos/Projectes/of_preRelease_v0061_linux_FAT/addons/../apps/OF-TangibleFramework/ofxTableGestures/src/Graphics/objects/CursorFeedback.hpp:35, 
       from /home/thechaos/Projectes/of_preRelease_v0061_linux_FAT/addons/../apps/OF-TangibleFramework/ofxTableGestures/src/Graphics/objects/CursorFeedback.cpp:31: 
../../../addons/ofxTableGestures/ext/boost/fusion/functional/invocation/invoke_procedure.hpp: In function ‘void boost::fusion::invoke_procedure(Function, const Sequence&) [with Function = void (tuio::CanBasicFingers<Graphic>::*)(long int, float, float, float, float, float), Sequence = boost::fusion::joint_view<boost::fusion::joint_view<boost::fusion::iterator_range<boost::fusion::vector_iterator<const boost::fusion::vector6<long int, float, float, float, float, float>, 0>, boost::fusion::vector_iterator<boost::fusion::vector6<long int, float, float, float, float, float>, 0> >, const boost::fusion::single_view<tuio::CanBasicFingers<Graphic>*> >, boost::fusion::iterator_range<boost::fusion::vector_iterator<boost::fusion::vector6<long int, float, float, float, float, float>, 0>, boost::fusion::vector_iterator<const boost::fusion::vector6<long int, float, float, float, float, float>, 6> > >]’: 
../../../addons/ofxTableGestures/src/oscGestures/tuioApp.hpp:122: instantiated from ‘void tuio::AlternateCallback<C, M, E>::run(tuio::TEvent*) [with C = tuio::CanBasicFingers<Graphic>, M = void (tuio::CanBasicFingers<Graphic>::*)(long int, float, float, float, float, float), E = tuio::TeventBasicFingersMoveFinger]’ 
/home/thechaos/Projectes/of_preRelease_v0061_linux_FAT/addons/../apps/OF-TangibleFramework/ofxTableGestures/src/Graphics/objects/CursorFeedback.cpp:64: instantiated from here 
../../../addons/ofxTableGestures/ext/boost/fusion/functional/invocation/invoke_procedure.hpp:88: error: incomplete type ‘boost::fusion::detail::invoke_procedure_impl<void (tuio::CanBasicFingers<Graphic>::*)(long int, float, float, float, float, float), const boost::fusion::joint_view<boost::fusion::joint_view<boost::fusion::iterator_range<boost::fusion::vector_iterator<const boost::fusion::vector6<long int, float, float, float, float, float>, 0>, boost::fusion::vector_iterator<boost::fusion::vector6<long int, float, float, float, float, float>, 0> >, const boost::fusion::single_view<tuio::CanBasicFingers<Graphic>*> >, boost::fusion::iterator_range<boost::fusion::vector_iterator<boost::fusion::vector6<long int, float, float, float, float, float>, 0>, boost::fusion::vector_iterator<const boost::fusion::vector6<long int, float, float, float, float, float>, 6> > >, 7, true, false>’ used in nested name specifier 

Si je copie le code conflictuel dans un même fichier, je peux le compiler. Donc, je sais que le code lui-même est OK, le problème est la façon dont je l'instancie.

Comment puis-je connaître l'origine de cette erreur? Est-il possible d'obtenir la trace du compilateur C++ et du préprocesseur pour obtenir des messages plus informatifs?

edit: J'utilise gcc 4.4.1

+0

J'ai utilisé l'option -E dans gcc et je trouve pas problèmes dans les inclusions. Je me suis retrouvé avec un code compact démontrant ce comportement étrange. Il semble être lié au nombre d'arguments en utilisant un boost :: fusion :: vector. Plus de détails: http://stackoverflow.com/questions/2547787/boost-fusion-strange-problem-depending-on-number-of-elements-on-a-vector. –

Répondre

3

Ce serait plus simple si vous nous donniez le compilateur.

Sur gcc vous pouvez voir le fichier prétraité en utilisant l'option -E. Si vous essayez de compiler le fichier prétraité, il devrait être beaucoup plus facile à diagnostiquer. En outre, vous verrez exactement quels sont les types impliqués.

En ce qui concerne l'erreur spécifique, la dernière ligne est généralement celle qui indique:

boost::fusion::detail::invoke_procedure_impl< 
    void (tuio::CanBasicFingers<Graphic>::*) 
     (long int, float, float, float, float, float), 
    const boost::fusion::joint_view< 

    boost::fusion::joint_view< 
     boost::fusion::iterator_range< 
     boost::fusion::vector_iterator< 
      const boost::fusion::vector6<long int, float, float, float, float, 
       float>, 
      0 
     >, 
     boost::fusion::vector_iterator< 
      boost::fusion::vector6<long int, float, float, float, float, float>, 
      0 
     > 
     >, 
     const boost::fusion::single_view< tuio::CanBasicFingers<Graphic>* > 
    >, // joint_view 

    boost::fusion::iterator_range< 
     boost::fusion::vector_iterator< 
     boost::fusion::vector6<long int, float, float, float, float, float>, 0 
     >, 
     boost::fusion::vector_iterator< 
     const boost::fusion::vector6<long int, float, float, float, float, 
      float>, 
     6 
     > 
    > // iterator_range 

    >, 
    7, 
    true, 
    false 
> 

Bon, alors reformatage aide un peu ici.

Il semble que vous avez un espace de noms tuio qui doit contenir une classe de modèle CanBasicFingers dont vous souhaitez utiliser le Graphic instanciation et obtenir un pointeur vers une fonction membre.

En supposant que vous ayez tous les Boost.Fusion inclus, les chances sont CanBasicFingers ou Graphic ne sont pas inclus correctement.

Sinon, recherchez le mélange dans la constance des itérateurs: les plages sont définies chacune avec un const et un itérateur non-const qui est carrément étrange.

Vous devriez essayer de les appeler séparément.

En tant que technique générale pour le diagnostic, je ne peux que recommander Divide And Conquer approches. Vous devriez essayer de construire l'expression peu à peu:

namespace fusion = boost::fusion; 

// First 
typedef void (tuio::CanBasicFingers<Graphic>::* function_t) 
    (long int, float, float, float, float, float); 

// Second 
typedef fusion::vector6<long int, float, float, float, float, float> vector_t; 

// Third: the iterators 
typedef fusion::vector_iterator< const vector_t, 0 > const_iterator_begin; 
typedef fusion::vector_iterator< const vector_t, 6 > const_iterator_end; 

typedef fusion::vector_iterator< vector_t, 0 > iterator_begin; 
typedef fusion::vector_iterator< vector_t, 6 > iterator_end; 

// Fourth: the ranges 
// (which const-ness are oddly messed up) 
typedef fusion::iterator_range< const_iterator_begin, iterator_end > range_1; 
typedef fusion::iterator_range< iterator_begin, const_iterator_end > range_2; 

// Fifth the views 
typedef const fusion::single_view<tuio::CanBasicFingers<Graphic>*> single_view; 
typedef fusion::joint_view< range_1, single_view > joint_view_internal; 
typedef fusion::joint_view< joint_view_internal, range_2 > joint_view_external; 

// and here is the final type (aaaah!) 
typedef fusion::detail::invoke_procedure_impl< 
    function_t, 
    joint_view_external, 
    7, 
    true, 
    false 
> procedure_type; 

cette forme décomposée Compiler, devrait donner l'erreur à un endroit plus précis :)

+0

J'utilise g ++ 4.4.1. Matthieu M., c'est absolument génial! Je vais essayer d'utiliser cette approche pour localiser le problème! –

0

Le type semble être (de la dernière ligne de l'erreur):

boost::fusion::detail::invoke_procedure_impl<void (tuio::CanBasicFingers<Graphic>::*)(long int, float, float, float, float, float), const boost::fusion::joint_view<boost::fusion::joint_view<boost::fusion::iterator_range<boost::fusion::vector_iterator<const boost::fusion::vector6<long int, float, float, float, float, float>, 0>, boost::fusion::vector_iterator<boost::fusion::vector6<long int, float, float, float, float, float>, 0> >, const boost::fusion::single_view<tuio::CanBasicFingers<Graphic>*> >, boost::fusion::iterator_range<boost::fusion::vector_iterator<boost::fusion::vector6<long int, float, float, float, float, float>, 0>, boost::fusion::vector_iterator<const boost::fusion::vector6<long int, float, float, float, float, float>, 6> > >, 7, true, false> 

Cela nous donne des possibilités dont je pourrais soupçonner tuio::CanBasicFingers<> puisque la chaîne include contient tuioApp.hpp. Si tuio :: CanBasicFingers n'a pas encore été défini au moment de l'instanciation dans tuioApp.hpp, vous obtiendrez l'erreur.

+0

Il est définitivement lié à 'tuio :: CanBasicFingers <>'. Dans son constructeur, j'instancie un autre template (qui est le support de invoke_procedure) qui prend CanBasicFingers comme argument de template. Mais j'ai utilisé ce type de modèle avant le succès apparent. Si je commente cette instanciation, elle compile. Cependant, je ne vois pas comment créer cet objet après avoir complètement défini 'CanBasicFingers'. –

Questions connexes