代码之家  ›  专栏  ›  技术社区  ›  chaos.ct

增强融合:一个奇怪的问题取决于矢量上元素的数量

  •  2
  • chaos.ct  · 技术社区  · 16 年前

    我正在尝试在个人项目中使用Boost::Fusion(Boost v1.42.0)。这段代码有一个有趣的错误:

    #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):

    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
    

    但是,如果我将向量中的参数个数和方法从6改为5, int,float,float,char,int,int int,float,float,char,int ,我可以毫无问题地编译它。

    我怀疑最大数量的参数是一个限制,但我试图通过定义 FUSION_MAX_VECTOR_SIZE 没有成功。

    我看不出我做错了什么。你能复制这个吗?它会是一个增强型错误吗(我怀疑,但这不是不可能的)?

    1 回复  |  直到 14 年前
        1
  •  3
  •   GManNickG    16 年前

    是的,确实需要更改一些迭代限制。你换错了。:)

    你需要定义的是 BOOST_FUSION_INVOKE_PROCEDURE_MAX_ARITY ;默认为6。您显然需要7个(但也可以将其增加到10个):

    #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 . 选择一个与你所做的相关的。从那里,它告诉您默认值和选项是什么。


    就代码本身而言,我应该指出 push_front 功能:

    #include "boost/fusion/include/push_front.hpp"
    
    // ...
    
    boost::fusion::invoke_procedure(&Class2::met,
                                    boost::fusion::push_front(t.s, &p));
    

    所以您不需要在开始时进行更详细的插入。

    推荐文章