English 中文(简体)
在对信号排位的模板功能具有约束力时使用持有人
原标题:Using placeholder when binding a template function for signal slot

I am trying to bind a template function during signaling. However, when I use a placeholder in the slot function, I get a "negative subscript" compiler error. I am using Visual Studio 2008. Thanks.

法典:

class My
{
private:
    boost::signals2::signal<void (int)> sig;

public:
    template < typename F, typename T, typename A1 >
    void proxy( F f, T t, A1 a1 )
    {
        boost::bind( f, t, a1 );    // this gets messaged elsewhere
    }

    int foo( int i )
    {
        return i-1;
    }

    int bar( int i )
    {
        return i+1;
    }

    template < typename F, typename T, typename A1 >
    boost::signals2::connection connect( F f, T t, A1 a1 )
    {
        return sig.connect( boost::bind( &My::proxy< F, T, A1 >, t, f, t, a1 ) );
    }

    void main()
    {
        boost::signals2::connection c1 = connect( &My::foo, this, 11 );     // ok
        boost::signals2::connection c2 = connect( &My::bar, this, _1 );     // negative subscript
    }
};

错误:

boost/bind/arg.hpp(37) : error C2118: negative subscript
boost/bind/bind.hpp(450) : see reference to function template instantiation  boost::arg<I>::arg<A1>(const T &)  being compiled
with
[
    I=1,
    A1=int,
    T=int
]
boost/bind/bind_template.hpp(32) : see reference to function template instantiation  void boost::_bi::list4<A1,A2,A3,A4>::operator ()<F,boost::_bi::list1<int &>>(boost::_bi::type<T>,F &,A &,int)  being compiled
with
[
    A1=boost::_bi::value<My *>,
    A2=boost::_bi::value<int (__thiscall My::* )(int)>,
    A3=boost::_bi::value<My *>,
    A4=boost::arg<1>,
    F=boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,
    T=void,
    A=boost::_bi::list1<int &>
]
boost/function/function_template.hpp(153) : see reference to function template instantiation  void boost::_bi::bind_t<R,F,L>::operator ()<T0>(A1 &)  being compiled
with
[
    R=void,
    F=boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,
    L=boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>,
    T0=int,
    A1=int
]
boost/function/function_template.hpp(147) : while compiling class template member function  void boost::detail::function::void_function_obj_invoker1<FunctionObj,R,T0>::invoke(boost::detail::function::function_buffer &,T0) 
with
[
    FunctionObj=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>,
    R=void,
    T0=int
]
boost/function/function_template.hpp(913) : see reference to class template instantiation  boost::detail::function::void_function_obj_invoker1<FunctionObj,R,T0>  being compiled
with
[
    FunctionObj=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>,
    R=void,
    T0=int
]
boost/function/function_template.hpp(722) : see reference to function template instantiation  void boost::function1<R,T0>::assign_to<Functor>(Functor)  being compiled
with
[
    R=void,
    T0=int,
    Functor=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>
]
boost/function/function_template.hpp(1065) : see reference to function template instantiation  boost::function1<R,T0>::function1<F>(Functor,int)  being compiled
with
[
    R=void,
    T0=int,
    F=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>,
    Functor=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>
]
boost/function/function_template.hpp(1105) : see reference to function template instantiation  boost::function<Signature>::function<F>(Functor,int)  being compiled
with
[
    Signature=void (int),
    F=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>,
    Functor=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>
]
boost/signals2/detail/slot_template.hpp(137) : see reference to function template instantiation  boost::function<Signature> &boost::function<Signature>::operator =<F>(Functor)  being compiled
with
[
    Signature=void (int),
    F=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>,
    Functor=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>
]
boost/signals2/detail/slot_template.hpp(81) : see reference to function template instantiation  void boost::signals2::slot1<R,T1,SlotFunction>::init_slot_function<F>(const F &)  being compiled
with
[
    R=void,
    T1=int,
    SlotFunction=boost::function<void (int)>,
    F=boost::_bi::bind_t<void,boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>>
]
test.cpp(179) : see reference to function template instantiation  boost::signals2::slot1<R,T1,SlotFunction>::slot1<boost::_bi::bind_t<R,F,L>>(const boost::_bi::bind_t<R,F,L> &)  being compiled
with
[
    R=void,
    T1=int,
    SlotFunction=boost::function<void (int)>,
    F=boost::_mfi::mf3<void,My,int (__thiscall My::* )(int),My *,boost::arg<1>>,
    L=boost::_bi::list4<boost::_bi::value<My *>,boost::_bi::value<int (__thiscall My::* )(int)>,boost::_bi::value<My *>,boost::arg<1>>
]
test.cpp(196) : see reference to function template instantiation  boost::signals2::connection My::connect<int(__thiscall My::* )(int),My*,boost::arg<I>>(F,T,A1)  being compiled
with
[
    I=1,
    F=int (__thiscall My::* )(int),
    T=My *,
    A1=boost::arg<1>
]
最佳回答

Possibly typo? The member function &My::proxy< F, T, A1 > in the question takes the placeholder _1 s type itself instead of the actual parameter int.
So in this case, changing &My::proxy< F, T, A1 > to &My::proxy< F, T, int > will resolve the error.
Here is a test on ideone.

问题回答

暂无回答




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签