Было бы проще, если бы вы дали нам компилятор.
На 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;
Компиляция этой разложенной формы должна привести к ошибке в более точном месте:)