使用boost::bind、boost::function和boost::factory出现问题

3

我试图使用boost::factory和boost::bind,但一直没有成功。

我有一个名为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]]’

请问我做错了什么?


注:本文涉及IT技术相关内容。
1个回答

1

bind函数返回一个两个参数的函数对象,因为你将构造函数的第三个和第四个参数绑定到了占位符_1_2的值上。然而,你将结果存储在了一个零参数的function对象中。

我找到了六年前的一篇参考文献,解释说即使声明了默认值,绑定函数时也不能省略参数。

我认为你有三个选择:

  1. 在调用bind时,提供实际的int值而不是占位符。
  2. 更改f的声明以指示它存储一个两个参数的函数,并且每次调用它时都提供这两个值。
  3. 将最后两个参数绑定到变量。请参见Boost.Lambda文档中的Delaying constants and variables。然后,您可以将这些变量设置为构造函数声明的相同默认值。要使用默认值,请不做任何操作。要指定非默认值,请在调用f之前为这些变量赋值。

最后一种选项可能只会使您的代码更难阅读,而没有太多好处,因此最好选择前两种选项之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接