[phoenix][phoenix3][MPL] incompatibility between MPL and Phoenix3
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; }
alfC <alfredo.correa <at> gmail.com> writes:
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... unction.cpp
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’
Thanks for the report. I just commited a fix. The problem is with some macro definitions inside phoenix/core/limits.hpp. It is the macro documented here: http://www.boost.org/doc/libs/1_45_0/libs/mpl/doc/refmanual/limit-metafuncti... arity.html However, this fix might introduce new problems, whenever the PHOENIX_LIMIT constant is set too high. The problem lies deep within the use of the preprocessor in some mpl internal code. Further investigation is needed! The problematic code can be tested with for example this code: // This is needed to generate the mpl code. #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS // define to something which is not the default: // (default is 5) #define BOOST_MPL_LIMIT_METAFUNCTION_ARITY 10 #include <boost/mpl/multiplies.hpp> #include <boost/mpl/apply.hpp> int main() { }
The full code (almost identical to the example) follows -- Thank you, Alfredo
Regards, Thomas
On Sun, Nov 28, 2010 at 4:12 AM, Thomas Heller <thom.heller@googlemail.com> wrote:
alfC <alfredo.correa <at> gmail.com> writes:
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... unction.cpp
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’
Thanks for the report. I just commited a fix.
I (svn) checked out revision 66827 and the problem is still there (?). I am using this server https://svn.boost.org/svn/boost/sandbox/SOC/2010/phoenix3/boost/phoenix is there another one where you uploaded the fixes?
The problematic code can be tested with for example this code:
// This is needed to generate the mpl code. #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS // define to something which is not the default: // (default is 5) #define BOOST_MPL_LIMIT_METAFUNCTION_ARITY 10
#include <boost/mpl/multiplies.hpp> #include <boost/mpl/apply.hpp>
I found that including MPL hpps before phoenix hpps allows to compile the example (not a real fix)
On Nov 28, 4:12 am, Thomas Heller <thom.hel...@googlemail.com> wrote:
alfC <alfredo.correa <at> gmail.com> writes:> 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/phoeni... unction.cpp
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’
Thanks for the report. I just commited a fix. The problem is with some macro definitions inside phoenix/core/limits.hpp. It is the macro documented here:http://www.boost.org/doc/libs/1_45_0/libs/mpl/doc/refmanual/limit-met... arity.html However, this fix might introduce new problems, whenever the PHOENIX_LIMIT constant is set too high. The problem lies deep within the use of the preprocessor in some mpl internal code. Further investigation is needed!
Indeed, it seems that this workaround introduce new problems, for example Boost.Accumulators produce errors: /home/user/usr/include/boost/accumulators/numeric/detail/ function_n.hpp:83: error: ‘apply10’ in namespace ‘boost::mpl’ does not name a type Thanks, Alfredo
participants (3)
-
alfC
-
Alfredo Correa
-
Thomas Heller