Решение сложной неполной ошибки типа - PullRequest
2 голосов
/ 29 марта 2010

Я получаю ошибку неполного типа при попытке компилировать мой код. Я знаю, что это связано с включениями, но мой проект большой и использует несколько шаблонов, поэтому я не могу найти, какой тип на самом деле неполный. Сообщение об ошибке тоже не помогает:

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

Если я скопирую конфликтующий код в тот же файл, я смогу его скомпилировать. Так что я знаю, что сам код в порядке, проблема в том, как я его создаю.

Как я могу отследить происхождение этой ошибки? Есть ли способ получить трассировку компилятора и препроцессора c ++ для получения более информативных сообщений?

edit: я использую gcc 4.4.1

Ответы [ 2 ]

3 голосов
/ 29 марта 2010

Было бы проще, если бы вы дали нам компилятор.

На gcc вы можете увидеть предварительно обработанный файл, используя опцию -E. Если вы попытаетесь скомпилировать предварительно обработанный файл, диагностика станет намного проще. Кроме того, вы увидите, какие именно типы задействованы.

Что касается конкретной ошибки, последняя строка, как правило, является ориентировочной:

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
>

Хорошо, поэтому переформатирование немного помогает.

Похоже, у вас есть пространство имен tuio, которое должно содержать шаблонный класс CanBasicFingers, из которого вы хотите использовать экземпляр Graphic и получить указатель на функцию-член.

Предполагая, что у вас есть все права на Boost.Fusion, есть вероятность, что CanBasicFingers или Graphic не включены правильно.

В противном случае, ищите смесь в константе итераторов: диапазоны определяются каждый с константным и неконстантным итератором, что совершенно странно.

Вы должны попытаться вызвать их отдельно.

Как общий метод диагностики, я могу только рекомендовать Divide And Conquer подходы. Вы должны постараться построить выражение понемногу:

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;

Компиляция этой разложенной формы должна привести к ошибке в более точном месте:)

0 голосов
/ 29 марта 2010

Тип представляется (из последней строки ошибки):

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>

Это дает нам некоторые возможности, о которых я могу подозревать tuio::CanBasicFingers<>, поскольку цепочка включения содержит tuioApp.hpp. Если tuio :: CanBasicFingers еще не был определен к моменту создания экземпляра в tuioApp.hpp, вы получите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...