boost :: bind,boost :: function和boost :: factory的问题

时间:2011-03-16 20:32:36

标签: c++ boost-bind boost-function

我正在努力尝试将boost :: bind与boost :: factory

一起使用

我有这个类Zambas有4个参数(2个字符串和2个整数)和

class Zambas {

public:

Zambas(const std::string&, const std::string&,int z1=0,int z2=0) {    
      if (z1==z2){

      }
    }
};

在其他方法中,我有以下调用

boost::function<Zambas*()> f(boost::bind(boost::factory<Zambas*>(), std::string(""), std::string(""),_1,_2));

因以下编译器错误而失败:

bind.hpp:382: error: no match for ‘operator[]’ in ‘a[boost::_bi::storage3<A1, A2, boost::arg<I> >::a3_ [with A1 = boost::_bi::value<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, A2 = boost::_bi::value<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, int I = 1]]’

我做错了什么?

1 个答案:

答案 0 :(得分:1)

bind函数返回一个双参数仿函数,因为您将构造函数的第三个和第四个参数绑定到占位符值_1_2。但是,您将结果存储在零参数function对象中。

我发现a reference from six years ago解释了绑定函数时无法省略参数,即使它们是使用默认值声明

我认为你有三种选择:

  1. 在致电int而非占位符时提供实际bind值。
  2. 更改f的声明以指示它存储双参数函数,然后在调用它时始终提供这两个值。
  3. 将最后两个参数绑定到变量。请参阅Boost.Lambda文档中的Delaying constants and variables。然后,您可以将这些变量设置为与构造函数声明的默认值相同的默认值。要使用默认值,请不要再执行任何操作。要指定非默认值,请在调用f之前为这些变量指定值。
  4. 最后一个选项可能只是让您的代码更难以阅读而没有太大的好处,所以更喜欢前两个选项中的一个。