Visual Studio 2010 и Boost :: Bind - PullRequest
       12

Visual Studio 2010 и Boost :: Bind

8 голосов
/ 19 февраля 2010

У меня есть этот простой кусок кода, который использует boost :: bind:

#include <boost/bind.hpp>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> a;
    std::vector<std::pair<bool,int> > b;

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    std::transform(a.begin(), a.end(), std::back_inserter(b),
                   boost::bind(std::make_pair<bool, int>, false, _1));
}

Я получаю массу ошибок в VS2010 RC, например:

Error   1   error C2780: 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided c:\projects\testtuple\main.cpp  18  
Error   2   error C2780: 'boost::_bi::bind_t<Rt2,boost::_mfi::cmf8<R,T,B1,B2,B3,B4,B5,B6,B7,B8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(boost::type<T>,R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7,B8) const,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 11 arguments - 3 provided   c:\projects\testtuple\main.cpp  18

Я что-то не так делаю? Если это ошибка в компиляторе, как я могу ее обойти?

РЕДАКТИРОВАТЬ: добавлен весь контрольный пример.

Пояснение: код компилируется в VS2008.

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

Обновление:

Проблема в том, что make_pair кажется перегруженным в STL, который поставляется с VS2010 (это не было в предыдущих версиях VS или в GCC). Обходной путь должен сделать явным, какую из перегрузок вы хотите, с помощью приведения:

#include <boost/bind.hpp>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>


int main()
{
    std::vector<int> a;
    std::vector<std::pair<bool,int> > b;

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    typedef std::pair<bool, int> (*MakePairType)(bool, int);

    std::transform(a.begin(), a.end(), std::back_inserter(b),
                    boost::bind((MakePairType)&std::make_pair<bool, int>,
                                false, _1));
}

Дополнительные сведения см. В руководстве Boost bind .

0 голосов
/ 19 февраля 2010

Я думаю, вы просто хотите std :: bind1st (& std :: make_pair, false) std::bind1st(std::ptr_fun(&std::make_pair<bool, int>), false))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...