Не могу использовать boost :: bind для доступа к элементам boost :: tuple - PullRequest
1 голос
/ 26 июля 2011

Я использую компилятор i686-apple-darwin10-gcc-4.2.1 на OSX.6 (я обновил версию 10.5 и перенес предыдущий инструментарий dev).

Явключая эти библиотеки в мою реализацию:

#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.

Это ОБЯЗАТЕЛЬНО, что я получаю только следующее сообщение об ошибке относительно моеговнутренняя привязка:

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 Ответ

1 голос
/ 26 июля 2011

Изменение

std::equal<unsigned long>

до

std::equal<unsigned long>()

Ну, std::equal - это шаблон функции, отсюда и сообщение об ошибке. Вы, вероятно, хотели std::equal_to, поэтому используйте следующее:

std::equal_to<unsigned long>()
...