2010-02-19 13 views
8

Mam ten prosty kawałek kodu, który używa boost :: wiążą:Visual Studio 2010 i boost :: wiążą

#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)); 
} 

Dostaję mnóstwo błędów w VS2010 RC, takich jak:

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 

Czy robię coś nie tak? Jeśli jest to błąd w kompilatorze, w jaki sposób mogę go obejść?

EDYCJA: dodano całą sprawę testową.

Wyjaśnienie: kod kompiluje się w VS2008.

+0

Być może masz konflikt między 'std :: tr1 :: bind' i' boost :: bind', ale trudno powiedzieć, czy nie publikujesz pełnego przykładu. – Manuel

+0

Również dlaczego sugerujesz, że problem jest spowodowany przez błąd w VC++ 2010, czy próbowałeś skompilować ten kod na innym kompilatorze? – Manuel

+0

zobacz moją edycję pełnego kodu. kompiluje się dobrze w VS2008. – Zack

Odpowiedz

3

Aktualizacja:

Problemem jest to, że make_pair wydaje się być przeładowany w STL, który jest dostarczany z VS2010 (nie było go w poprzednich wersjach VS ani w GCC). Rozwiązaniem jest, aby który z jednoznaczne z przeciążeniem chcesz, z obsadą:

#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)); 
} 

uzyskać dodatkowe szczegóły patrz Boost bind manual.

+0

Nie, wciąż jest mnóstwo błędów, teraz po prostu pochodzą od 'std :: bind'. 'Błąd błąd C2780: 'std :: tr1 :: _ Bind <_Ret, _Ret, std :: tr1 :: _ Bind0 >> std :: tr1 :: bind (_Fty) ": oczekuje 1 argumentów - 3 pod warunkiem \t c: \ projects \ testtuple \ main.cpp \t 17' – Zack

+0

Może to dlatego, że' make_pair' jest przeciążone, możesz spróbować z manekinem 'std :: pair foo (bool, int) 'funkcja własna zamiast' make_pair'? – Manuel

+0

pracował z funkcją fikcyjną. ale mam tak wiele miejsc używając 'std :: make_pair', nie mogę utworzyć fikcyjnej funkcji wszędzie, czy masz sugestię? – Zack

0

myślę po prostu chcesz std :: bind1st (& std :: make_pair false) std::bind1st(std::ptr_fun(&std::make_pair<bool, int>), false))

+0

Jak wyglądałby nowy "transform"? Próbowałem 'std :: transform (a.begin(), a.end(), std :: back_inserter (b), std :: bind1st (& std :: make_pair , false));' ale nie kompiluje . A co jeśli chcę powiązać oba parametry 'make_pair'? – Zack

+0

Mam go do pracy, jeśli opakowałem 'make_pair' z' std :: ptr_fun' – Zack

+0

Możesz potrzebować 'std :: bind1st (std :: ptr_fun (& std :: make_pair ), false))'. bind1st wiąże tylko obiekty funkcji. – visitor