
Hi, I decided to try Phoenix3. I looked up at a couple of examples and since I use Boost.Units (which depends on Boost.MPL) heavily I tried to mix both only to find out that there is an obscure incompatibility between MPL and Phoenix3. The way to show this is just to compile the phoenix3/.../function.cpp example https://svn.boost.org/svn/boost/sandbox/SOC/2010/phoenix3/libs/phoenix/examp... with the following added line: #include<boost/mpl/multiplies.hpp> I get this error message: In file included from function.cpp:12: /home/user/usr/include/boost/mpl/multiplies.hpp:38: error: wrong number of template arguments (7, should be 5) /home/user/usr/include/boost/mpl/aux_/preprocessed/gcc/times.hpp:68: error: provided for ‘template<class N1, class N2, class N3, class N4, class N5> struct boost::mpl::times’ The full code (almost identical to the example) follows -- Thank you, Alfredo / *============================================================================= Copyright (c) 2001-2003 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include <vector> #include <algorithm> #include <iostream> #include <boost/phoenix/core.hpp> #include <boost/phoenix/function.hpp> #include<boost/mpl/multiplies.hpp> ///////////// offending line using boost::phoenix::function; struct is_odd_ { template <typename Arg> struct result { typedef bool type; }; template <typename Arg> bool operator()(Arg arg1) const { return arg1 % 2 == 1; } }; function<is_odd_> is_odd; int main() { using boost::phoenix::arg_names::arg1; int init[] = { 2, 10, 4, 5, 1, 6, 8, 3, 9, 7 }; std::vector<int> c(init, init + 10); typedef std::vector<int>::iterator iterator; // Find the first odd number in container c iterator it = std::find_if(c.begin(), c.end(), is_odd(arg1)); if (it != c.end()) std::cout << *it << std::endl; // if found, print the result return 0; }