2010-03-29 27 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