2010-02-19 54 views
8

我有這樣的一段簡單的代碼,使用的boost ::綁定:的Visual Studio 2010和boost ::綁定

#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中編譯。

+0

也許你在'std :: tr1 :: bind'和'boost :: bind'之間存在衝突,但是很難判斷你是否發佈了一個完整的示例 – Manuel 2010-02-19 11:54:14

+0

也是爲什麼你認爲這個問題是由於由VC++ 2010中的一個錯誤,你是否試圖在不同的編譯器上編譯這段代碼? – Manuel 2010-02-19 11:57:07

+0

請參閱我的編輯完整代碼。它在VS2008中編譯得很好。 – Zack 2010-02-19 12:03:30

回答

3

更新:

的問題是,make_pair似乎在超載與VS2010一起發佈的STL(它不在以前版本的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 manual

+0

不,仍然有很多錯誤,現在它們只是來自'std :: bind'。 '錯誤錯誤C2780:'std :: tr1 :: _ Bind <_Ret,_Ret,std :: tr1 :: _ Bind0 >> std :: tr1 :: bind(_Fty) ':期望1個參數-3提供\t c:\ projects \ testtuple \ main.cpp \t 17' – Zack 2010-02-19 12:10:59

+0

也許是因爲'make_pair'被重載,你可以嘗試一個虛擬的'std :: pair foo(bool,int) '你自己的功能而不是'make_pair'? – Manuel 2010-02-19 12:15:54

+0

它使用虛擬功能。但我有很多地方使用'std :: make_pair',我無法在任何地方創建虛擬函數,你有什麼建議嗎? – Zack 2010-02-19 12:24:02

0

我覺得你只是想 的std :: bind1st(&的std :: make_pair,FALSE) std::bind1st(std::ptr_fun(&std::make_pair<bool, int>), false))

+0

新的'transform'會如何顯示?我試過'std :: transform(a.begin(),a.end(),std :: back_inserter(b),std :: bind1st(&std :: make_pair ,false));'但它不能編譯。另外如果我想綁定兩個'make_pair'參數呢? – Zack 2010-02-19 12:08:17

+0

如果我用'std :: ptr_fun'封裝了'make_pair',我就得到了它的工作 – Zack 2010-02-19 12:22:34

+0

您可能需要'std :: bind1st(std :: ptr_fun(&std :: make_pair ),false))''。 bind1st只綁定函數對象。 – visitor 2010-02-19 12:23:40