首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::bind,boost::function和boost::factory的问题

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

Stack Overflow用户
提问于 2011-03-16 20:32:35
回答 1查看 1.4K关注 0票数 3

我正在尝试使用助推::绑定和助推::工厂,但没有成功。

我有这个类Zambas,有4个参数(2个字符串和2个int),并且

代码语言:javascript
复制
class Zambas {

public:

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

      }
    }
};

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

代码语言:javascript
复制
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]]’

我做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2011-03-16 23:10:04

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

我发现六年前的参考资料解释说,绑定函数时不能忽略参数,即使它们是用默认值声明的。

我想你有三个选择:

  1. 在调用bind而不是占位符时提供实际的bind值。
  2. 更改f的声明,以指示它存储一个双参数函数,然后在调用它时始终提供两个值。
  3. 将最后两个参数绑定到变量。参见http://lists.boost.org/boost-users/2004/12/9069.php文档中的Boost.Lambda文档。然后,可以将这些变量设置为与构造函数声明相同的默认值。若要使用默认值,只需执行以下操作。若要指定非默认值,请在调用f之前将值赋给这些变量。

最后一个选项可能只会使您的代码更难阅读,而不会有太大的好处,所以最好选择前两个选项中的一个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5331385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档