2010-03-29 60 views
2

尝试编译我的代码时出现不完整的类型错误。我知道它与包含有关,但我的项目很大,它使用了几个模板,所以我找不到哪种类型实际上是不完整的。错误信息也没有帮助:解决困难的不完整类型错误

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++编译器和预处理器的踪迹以获取更多信息?

编辑:我用gcc 4.4.1

+0

我用gcc的-E选项,我发现产生的误差不夹杂物中的问题。我结束了一个简洁的代码,演示了这种奇怪的行为。它似乎与使用boost :: fusion :: vector进行操作时的参数数量有关。更多细节:http://stackoverflow.com/questions/2547787/boost-fusion-strange-problem-depending-on-number-of-elements-on-a-vector。 – 2010-03-30 18:57:47

回答

3

,如果你给我们的编译器会更容易些。

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 instanciation并获得一个指向一个成员函数。

假设您已包含所有Boost.Fusion包括权利,则可能是CanBasicFingersGraphic未正确包含。

否则,查找在迭代器的常量性混合物:所述范围与一个const和非常量迭代这简直是奇怪定义的每个。

你应该尝试并分别调用它们。

作为诊断一般TECHNIC,我只能建议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

我正在使用g ++ 4.4.1。 Matthieu M.,这绝对是天才!我会尝试使用这种方法来定位问题! – 2010-03-29 19:18:57

0

类型似乎是(从错误中的最后一行):

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实例化的时候还没有定义,你会得到这个错误。

+0

它与'tuio :: CanBasicFingers <>'完全相关。在其构造函数中,我实例化另一个模板(它是invoke_procedure的持有者),它将'CanBasicFingers'作为模板参数。但是我在明显的成功之前使用了这种模式。如果我评论这个实例化它编译。但是我没有看到完全定义'CanBasicFingers'后如何创建这个对象。 – 2010-03-29 18:38:13