2013-11-04 84 views
1

我想在gcc 4.7.2上將一些代碼轉換爲C++ 11。部分代碼包括將boost::factory分配給boost::function。但是,如果我將其更改爲std::function,編譯失敗並伴有大量警告。下面是示例代碼重現錯誤:boost :: factory和std :: function

#include <boost/functional/factory.hpp> 
#include <boost/function.hpp> 
#include <functional> 

struct S { 
    S(int) {} 
}; 

int main() { 

    boost::function<S*(int)> b = boost::factory<S*>(); // ok 

    std::function<S*(int)> s = boost::factory<S*>(); // error 
} 

這給error: no match for call to ‘(boost::factory<S*>) (int)’

有趣的是,如果S不帶任何參數,std::function<S*()>分配給boost::factory毫無怨言。爲什麼這不起作用?是否有解決方法可以將boost::factory分配給std::function?我使用Boost.1.53

回答

1

似乎boost::factory<S*>堅持它的參數綁定到一個參考:

boost::factory<S*> factory; 

factory(17); // error 

int argument(17); 
factory(argument); // OK 

在此基礎上,似乎boost::function<S*(int)>傳遞參數爲int沒有完全將它轉發而std::function<S*(int)>似乎使用完美轉發的論點。因此,該參數不能被綁定到boost::factory<S*>參數。

當使用gccstd::function<...>通過const&作品傳遞參數:

std::function<S*(int const&)> factory = boost::factory<S*>(); 

不幸的是,同樣的工作,各地不與std::function<...>從libc中++工作。因爲你說過你試圖用gcc編譯代碼,但這可能不是什麼大問題。

相關問題