2010-03-30 5 views
2

개인 프로젝트에서 Boost :: Fusion (Boost v1.42.0)을 사용하려고합니다. 내가 벡터에서 인수의 수와 방법에서를 변경하는 경우, 그러나부스트 퓨전 : 벡터의 요소 수에 따라 이상한 문제가 발생합니다.

In file included from /home/thechaos/Escriptori/of_preRelease_v0061_linux_FAT/addons/ofxTableGestures/ext/boost/fusion/include/invoke_procedur 
e.hpp:10, 
       from problema concepte.cpp:11: 
/home/thechaos/Escriptori/of_preRelease_v0061_linux_FAT/addons/ofxTableGestures/ext/boost/fusion/functional/invocation/invoke_procedure.hpp: I 
n function ‘void boost::fusion::invoke_procedure(Function, const Sequence&) [with Function = void (Class2::*)(int, float, float, char, int, in 
t), Sequence = boost::fusion::joint_view<boost::fusion::joint_view<boost::fusion::iterator_range<boost::fusion::vector_iterator<const boost::f 
usion::vector<int, float, float, char, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, 0>, 
boost::fusion::vector_iterator<boost::fusion::vector<int, float, float, char, int, int, boost::fusion::void_, boost::fusion::void_, boost::fus 
ion::void_, boost::fusion::void_>, 0> >, const boost::fusion::single_view<Class2*> >, boost::fusion::iterator_range<boost::fusion::vector_iter 
ator<boost::fusion::vector<int, float, float, char, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion: 
:void_>, 0>, boost::fusion::vector_iterator<const boost::fusion::vector<int, float, float, char, int, int, boost::fusion::void_, boost::fusion 
::void_, boost::fusion::void_, boost::fusion::void_>, 6> > >]’: 
problema concepte.cpp:39: instantiated from here 
/home/thechaos/Escriptori/of_preRelease_v0061_linux_FAT/addons/ofxTableGestures/ext/boost/fusion/functional/invocation/invoke_procedure.hpp:88 
: error: incomplete type ‘boost::fusion::detail::invoke_procedure_impl<void (Class2::*)(int, float, float, char, int, int), const boost::fusio 
n::joint_view<boost::fusion::joint_view<boost::fusion::iterator_range<boost::fusion::vector_iterator<const boost::fusion::vector<int, float, f 
loat, char, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, 0>, boost::fusion::vector_itera 
tor<boost::fusion::vector<int, float, float, char, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion:: 
void_>, 0> >, const boost::fusion::single_view<Class2*> >, boost::fusion::iterator_range<boost::fusion::vector_iterator<boost::fusion::vector< 
int, float, float, char, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, 0>, boost::fusion: 
:vector_iterator<const boost::fusion::vector<int, float, float, char, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::voi 
d_, boost::fusion::void_>, 6> > >, 7, true, false>’ used in nested name specifier 

:

#include "boost/fusion/include/sequence.hpp" 
#include "boost/fusion/include/make_vector.hpp" 
#include "boost/fusion/include/insert.hpp" 
#include "boost/fusion/include/invoke_procedure.hpp" 
#include "boost/fusion/include/make_vector.hpp" 
#include <iostream> 

class Class1 
{ 
    public: 
    typedef boost::fusion::vector<int,float,float,char,int,int> SequenceType; 
    SequenceType s; 
     Class1(SequenceType v):s(v){} 
}; 

class Class2 
{ 
    public: 
    Class2(){} 
    void met(int a,float b ,float c ,char d ,int e,int f) 
    { 
     std::cout << a << " " << b << " " << c << " " << d << " " << e << std::endl; 
    } 
}; 

int main(int argn, char**) 
{ 
Class2 p; 
Class1 t(boost::fusion::make_vector(9,7.66f,8.99f,'s',7,6)); 
boost::fusion::begin(t.s); //OK 
boost::fusion::insert(t.s, boost::fusion::begin(t.s), &p); //OK 
boost::fusion::invoke_procedure(&Class2::met,boost::fusion::insert(t.s, boost::fusion::begin(t.s), &p)); //FAILS 
} 

그것은 (GCC 4.4.1) 컴파일에 실패 :이 코드 흥미로운 오류 6에서 5까지 int,float,float,char,int,int에서 int,float,float,char,int까지 문제없이 컴파일 할 수 있습니다.

나는 인수의 최대 개수가 제한적이라고 생각했지만, 성공하지 않고 FUSION_MAX_VECTOR_SIZE을 정의하여 변경하려고 시도했습니다.

내가 뭘 잘못하고 있는지 알 수 없습니다. 이것을 재현 할 수 있습니까? 그것은 부스트 ​​버그 수 있습니까 (나는 그것을 의심하지만 불가능하지 않다)?

답변

3

예 실제로 일부 반복 제한을 변경해야합니다. 너는 잘못된 것을 바꾸고있는 중이다. :)

정의 할 내용은 BOOST_FUSION_INVOKE_PROCEDURE_MAX_ARITY입니다. 당신은 분명히 7이 필요합니다 (그러나뿐만 아니라 (10)에 범프 수 있음) 6. 기본적으로는 다음과 같습니다

#define BOOST_FUSION_INVOKE_PROCEDURE_MAX_ARITY 10 

#include "boost/fusion/include/sequence.hpp" 
#include "boost/fusion/include/make_vector.hpp" 
#include "boost/fusion/include/insert.hpp" 
#include "boost/fusion/include/invoke_procedure.hpp" 
#include "boost/fusion/include/make_vector.hpp" 
#include <iostream> 
. 
. 
. 

는 호출 도메인 내에서 three total있다.

무언가의 한계를 찾을 때마다 documentation에서 "제한값"을 검색하십시오. 자신이하는 일과 관련된 것을 선택하십시오. 여기에서 기본값과 옵션이 무엇인지 알려줍니다.

#include "boost/fusion/include/push_front.hpp" 

// ... 

boost::fusion::invoke_procedure(&Class2::met, 
           boost::fusion::push_front(t.s, &p)); 

그래서 당신은 더 자세한 삽입 -에 - 시작 할 필요가 없습니다 : 그냥 코드 자체에 관한


, 나는 push_front 기능이있는 점을 지적한다.

+0

감사합니다. 이 오류로 3 일 동안 고생했습니다. 그것은 완벽하게 작동했습니다. –

+0

대신 BOOST_FUSION_INVOKE_MAX_ARITY가 필요했던 것과 비슷한 문제가있었습니다. 나는 그것이 다른 정의인지 또는 버전 사이에 정의 된 이름이 변경되었는지 확실하지 않습니다. – Catskul