我有一个使用boost 1.47 phoenix的Visual Studio 2008 C ++ 03应用程序(更新:也是1.49)。我想定义一个boost :: function来从列表中删除一个元素。例如:
#include <boost/phoenix.hpp>
#include <boost/function.hpp>
#include <boost/phoenix/stl/container.hpp>
#include <boost/phoenix/stl/algorithm/transformation.hpp>
#include <algorithm>
#include <list>
int main()
{
namespace bp = boost::phoenix;
namespace bpa = boost::phoenix::arg_names;
std::list< int > a;
boost::function< void( int ) > RemoveFromList = bp::remove( bp::ref( a ), bpa::arg1 );
return 0;
}
但是我的RemoveFromList
定义出现了一系列编译器错误。
Error 1 error C2504: 'boost::phoenix::impl::remove::result<Sig>' : base class undefined \boost\utility\result_of.hpp 80
Error 2 error C2039: 'type' : is not a member of 'boost::result_of<F>' \boost\phoenix\core\detail\preprocessed\function_eval_10.hpp 121
Error 3 error C2146: syntax error : missing ';' before identifier 'type' \boost\phoenix\core\detail\preprocessed\function_eval_10.hpp 122
Error 4 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int \boost\phoenix\core\detail\preprocessed\function_eval_10.hpp 122
Error 5 error C2602: 'boost::phoenix::detail::function_eval::result<Sig>::type' is not a member of a base class of 'boost::phoenix::detail::function_eval::result<Sig>' \boost\phoenix\core\detail\preprocessed\function_eval_10.hpp 122
Error 6 error C2868: 'boost::phoenix::detail::function_eval::result<Sig>::type' : illegal syntax for using-declaration; expected qualified-name \boost\phoenix\core\detail\preprocessed\function_eval_10.hpp 122
类似的函数AddToList
编译得很干净:
boost::function< void( int ) > AddToList = bp::push_back( bp::ref( a ), bpa::arg1 );
这也可以正常工作(但不那么优雅):
boost::function< void( int ) > RemoveFromList = bp::bind( &std::remove< std::list< int >::iterator, int >, a.begin(), a.end(), bpa::arg1 );
实现此功能的正确方法是什么?
由于
答案 0 :(得分:1)
使用Boost 1.48你的代码片段与GCC 4.7一起编译,前提是我有正确的包含,并且至关重要的是,只要定义了宏BOOST_RESULT_OF_USE_DECLTYPE
。没有后者,就失败了。
不知道如何在没有C ++ 11的情况下解决这个问题。