2013-11-04 1 views
1

gcc 4.7.2에서 일부 코드를 C++ 11로 변환하려고합니다. 코드의 일부에는 boost::factoryboost::function에 할당되어 있습니다. 그러나 std::function으로 변경하면 많은 경고와 함께 컴파일이 실패합니다. S가 인수를 취하지 않는 경우,boost :: factory and 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 
} 

std::function<S*()>은 불평없이 boost::factory에 할당, 흥미롭게도 error: no match for call to ‘(boost::factory<S*>) (int)’

제공 : 다음 샘플 코드에게 재현 한 오류입니다. 왜이 기능이 작동하지 않습니까? boost::factorystd::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*> 인수에 바인딩 할 수 없습니다.

const& 행위로 인수를 전달 gccstd::function<...>를 사용하여 :

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

불행하게도, 같은 작품은 주위의 libc에서 std::function<...> ++ 작동하지 않습니다. 당신은 gcc로 코드를 컴파일하려했으나 그다지 문제가되지 않을 것이라고 말했기 때문에 말입니다.