不能使用boost :: bind来访问boost :: tuple元素

时间:2011-07-26 04:54:29

标签: c++ boost bind tuples

我正在OSX.6上使用i686-apple-darwin10-gcc-4.2.1编译器(我升级了10.5安装并继承了之前的开发工具包)。

我将这些库包含在我的实现中:

#include <vector>
#include <boost/bind.hpp>
#include <boost/tuple/tuple.hpp>

我有一个看起来像这样的元组:

typedef boost::tuple<double, unsigned long, unsigned long, char> myTupleType;

我有一个这样的元组矢量:

std::vector<myTupleType> theTupleVector;

我有一个应该检索值的方法:

template <typename T,int i>
class accessTupleElement
{ 
public: 
    typedef typename boost::tuples::element<i,T>::type result_type;

    template <typename U> result_type operator()(const U& u) const
    { 
    // Select the ith element of the tuple T and return it 
    return boost::get<i>(u); 
    } 
};

然后我尝试做出如下精彩的事情:

std::find_if(startIter, endIter, boost::bind(std::equal<unsigned long>, boost::bind(accessTupleElement<myTupleType, 1>(), _1), 123L));

startIter和endIter是元组向量的开始和结束。我认为这会将函数对象与迭代器的值绑定,求值为元组的期望值,并将其与123进行比较。

这是MADDENING,我得到的是关于我的内部绑定的以下错误消息:

no matching function for call to 'bind(<unresolved overloaded function type>, boost::_bi::bind_t<boost::_bi::unspecified, accessTupleElement<boost::tuples::tuple<double, long unsigned int, long unsigned int, char, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, 1>, boost::_bi::list1<boost::arg<1> > >, boost::arg<2>&)'

我不明白,编译器怎么会混淆?只有一个名为accessTupleElement的标识符,我已经按照我试图解决此问题的所有提升和互联网文档进行了操作。这是如何解决的?

1 个答案:

答案 0 :(得分:1)

更改

std::equal<unsigned long>

std::equal<unsigned long>()

嗯,std::equal是一个函数模板,因此是错误消息。您可能想要std::equal_to,因此请使用以下内容:

std::equal_to<unsigned long>()