Я пытаюсь написать функцию, которая возьмет функтор в качестве аргумента, вызовет функтор, а затем вернет возвращаемое значение, завернутое в boost::shared_ptr
,«<class name> не предоставляет ошибку оператора вызова при попытке обернуть функцию возвращаемого значения
Следующие отказываются компилировать, и у меня все идеи. Я получаю «std :: vector < std :: string> не предоставляет оператор вызова» (примерно). Я использую Clang 3.1 на Mac OS X.
template< typename T >
boost::shared_ptr<T> ReturnValueAsShared(
boost::function< T() > func)
{
return boost::make_shared<T>(func());
}
Это контекст, в котором я пытаюсь использовать:
make_shared< packaged_task< boost::shared_ptr< std::vector<std::string> > > >(
bind(ReturnValueAsShared< std::vector<std::string> >,
bind([a function that returns a std::vector<std::string>])));
EDIT: Вот полный автономный тест. Этот код не компилировать с той же ошибкой, и для жизни меня я не могу видеть, что это не так:
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <string>
#include <vector>
std::vector<std::string> foo(std::string a)
{
std::vector<std::string> vec;
vec.push_back(a);
return vec;
}
template< typename T >
boost::shared_ptr<T> ReturnValueAsShared(
boost::function< T() > func)
{
return boost::make_shared<T>(func());
}
int main()
{
auto f = boost::bind(ReturnValueAsShared< std::vector<std::string> >,
boost::bind(foo, std::string("a")));
f();
} // main
А вот выход ошибки:
In file included from testcase.cpp:3:
In file included from /usr/local/include/boost/function.hpp:64:
In file included from /usr/local/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:47:
In file included from /usr/local/include/boost/function/detail/function_iterate.hpp:14:
In file included from /usr/local/include/boost/function/detail/maybe_include.hpp:13:
/usr/local/include/boost/function/function_template.hpp:132:18: error: type 'std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >' does not provide a call operator
return (*f)(BOOST_FUNCTION_ARGS);
^~~~
/usr/local/include/boost/function/function_template.hpp:907:53: note: in instantiation of member function 'boost::detail::function::function_obj_invoker0<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >::invoke' requested here
{ { &manager_type::manage }, &invoker_type::invoke };
^
/usr/local/include/boost/function/function_template.hpp:722:13: note: in instantiation of function template specialization 'boost::function0<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >::assign_to<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >' requested here
this->assign_to(f);
^
/usr/local/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function0<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >::function0<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >' requested here
base_type(f)
^
/usr/local/include/boost/bind/bind.hpp:243:43: note: in instantiation of function template specialization 'boost::function<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >()>::function<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >' requested here
return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
^
/usr/local/include/boost/bind/bind_template.hpp:20:27: note: in instantiation of function template specialization 'boost::_bi::list1<boost::_bi::bind_t<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > (*)(std::basic_string<char>), boost::_bi::list1<boost::_bi::value<std::basic_string<char> > > > >::operator()<boost::shared_ptr<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, boost::shared_ptr<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > > (*)(boost::function<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >()>), boost::_bi::list0>' requested here
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
^
testcase.cpp:27:4: note: in instantiation of member function 'boost::_bi::bind_t<boost::shared_ptr<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, boost::shared_ptr<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > > (*)(boost::function<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >()>), boost::_bi::list1<boost::_bi::bind_t<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > (*)(std::basic_string<char>), boost::_bi::list1<boost::_bi::value<std::basic_string<char> > > > > >::operator()' requested here
f();
^
1 error generated.
Вот еще несколько подсказок. Следующий код компилируется нормально, но это не помогает мне, так как это не код, который я хочу :)
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <string>
#include <vector>
std::vector<std::string> foo()
{
std::vector<std::string> vec;
return vec;
}
template< typename T >
boost::shared_ptr<T> ReturnValueAsShared(
boost::function< T() > func)
{
return boost::make_shared<T>(func());
}
int main()
{
auto f = boost::bind(ReturnValueAsShared< std::vector<std::string> >,
foo);
f();
} // main
Пожалуйста, упростите проблему и предоставите минимальный (не) рабочий пример кода. –
Какая ошибка? –
@KerrekSB Ошибка: std :: vector не предоставляет оператора вызова, когда я пытаюсь использовать его как 'ReturnValueAsShared >'. –
Lucas