2010-02-19 31 views
8

tengo este simple trozo de código que utiliza boost :: bind:Visual Studio 2010 y 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)); 
} 

Me estoy poniendo un montón de errores en VS2010 RC, tales como:

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 

¿Estoy haciendo algo mal? Si esto es un error en el compilador, ¿cómo puedo solucionarlo?

EDITAR: agregó todo el caso de prueba.

Aclaración: el código se compila en VS2008.

+0

Quizás tenga un conflicto entre 'std :: tr1 :: bind' y' boost :: bind' pero es difícil saber si no publica un ejemplo completo – Manuel

+0

También, ¿por qué sugiere que el problema está causado por un error en VC++ 2010, ¿ha intentado compilar este código en un compilador diferente? – Manuel

+0

ver mi edición para el código completo. compila bien en VS2008. – Zack

Respuesta

3

Actualización:

El problema es que make_pair parece estar sobrecargada en el STL que se envía con VS2010 (no estaba en versiones anteriores de VS o en GCC). La solución consiste en explicitar cuál de las sobrecargas que desea, con un reparto:

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

Para detalles adicionales ver el Boost bind manual.

+0

No, todavía hay muchos errores, ahora solo vienen de 'std :: bind'. 'Error error C2780: 'std :: tr1 :: _ Bind <_Ret, _Ret, std :: tr1 :: _ Bind0 >> std :: tr1 :: bind (_Fty) ': espera 1 argumentos - 3 proporcionado \t c: \ projects \ testtuple \ main.cpp \t 17' – Zack

+0

Tal vez es porque 'make_pair' está sobrecargado, ¿puedes probar con un dummy' std :: pair foo (bool, int) 'función propia en lugar de' make_pair'? – Manuel

+0

funcionó con una función ficticia. pero tengo tantos lugares usando 'std :: make_pair', no puedo crear una función ficticia en todas partes, ¿tienes alguna sugerencia? – Zack

0

creo que lo que desea es std :: bind1st (& std :: make_pair, falsa) std::bind1st(std::ptr_fun(&std::make_pair<bool, int>), false))

+0

¿Cómo se vería la nueva "transformación"? Intenté 'std :: transform (a.begin(), a.end(), std :: back_inserter (b), std :: bind1st (& std :: make_pair , false));' pero no compila . Además, ¿qué sucede si quiero vincular ambos parámetros 'make_pair'? – Zack

+0

Lo hice funcionar si envolví 'make_pair' con' std :: ptr_fun' – Zack

+0

Es posible que necesite 'std :: bind1st (std :: ptr_fun (& std :: make_pair ), false))'. bind1st solo une objetos de función. – visitor