我已经制定了以下内容,这似乎可以解决问题。不过,仍然对改进的答案感兴趣:
namespace bs2 = boost::signals2;
template <
typename Signature,
typename A1 = boost::parameter::void_,
typename A2 = boost::parameter::void_,
typename A3 = boost::parameter::void_,
typename A4 = boost::parameter::void_,
typename A5 = boost::parameter::void_,
typename A6 = boost::parameter::void_
>
struct my_signal_type : public bs2::signal_type<Signature, A1, A2, A3, A4, A5, A6>
{
typedef typename boost::parameter::value_type<args, bs2::keywords::tag::mutex_type, my_mutex>::type mutex_type;
typedef bs2::signal<
signature_type,
combiner_type,
group_type,
group_compare_type,
slot_function_type,
extended_slot_function_type,
mutex_type
> type;
};
template <
typename Signature,
typename A1 = boost::parameter::void_,
typename A2 = boost::parameter::void_,
typename A3 = boost::parameter::void_,
typename A4 = boost::parameter::void_,
typename A5 = boost::parameter::void_,
typename A6 = boost::parameter::void_
>
class MyEvent : public my_signal_type<Signature, A1, A2, A3, A4, A5, A6>::type
{
public:
typedef typename my_signal_type<Signature, A1, A2, A3, A4, A5, A6>::type base_type;
explicit MyEvent(const typename base_type::combiner_type& combiner = combiner_type())
: base_type(combiner)
{
}
};
让我有点困惑的一件事是,为什么在构造函数中使用“combiner_type”需要在类型声明中明确定义范围——然后它不需要默认参数。(在此处删除“typename”或“base_type::”会触发标准的“default-int”错误(这意味着“这看起来不像我知道的类型”)。这很奇怪,因为它是在基类中定义的.我猜这是一些奇怪的模板部分实例化的东西。