|
Boost Users : |
From: Tarjei Knapstad (tarjeik_at_[hidden])
Date: 2003-05-19 12:39:38
I encountered the following problem today which I've reduced down to a
simple example. Basically what I want to do is recurse through a
typelist (mpl::vector) popping an element each time and end recursion by
using apply_if with mpl::empty<List> as the condition. I've made a
simple Reverse class template to illustrate the problem. (The Reverse
class is of course intended to reverse the contents of a typelist....)
--------------------- begin code ---------------------
#include <boost/mpl/front.hpp>
#include <boost/mpl/push_back.hpp>
#include <boost/mpl/pop_front.hpp>
#include <boost/mpl/apply_if.hpp>
#include <boost/mpl/empty.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/vector.hpp>
using namespace boost::mpl;
template <typename List>
struct Reverse
{
typedef typename front<List>::type FrontElem;
typedef typename pop_front<List>::type Rest;
typedef typename apply_if<
empty<Rest>,
vector<FrontElem>,
typename push_back<typename Reverse<Rest>::Type,
FrontElem>::type
>::type Type;
};
typedef vector<int,int,long> List;
typedef Reverse<List>::Type RevList;
--------------------- end code -----------------------
When attempting to create the RevList type however, gcc spits the
following at me:
reverse.cpp: In instantiation of
`boost::mpl::pop_front<boost::mpl::vector0<boost::mpl::void_> >':
reverse.cpp:15: instantiated from
`Reverse<boost::mpl::vector0<boost::mpl::void_> >'
reverse.cpp:21: instantiated from `Reverse<boost::mpl::vector1<long
int> >'
reverse.cpp:21: instantiated from `Reverse<boost::mpl::vector2<int,
long int> >'
reverse.cpp:21: instantiated from `Reverse<List>'
reverse.cpp:25: instantiated from here
reverse.cpp:15: base class `
boost::mpl::pop_front_traits<boost::mpl::aux::vector_tag<0>
>::algorithm<boost::mpl::vector0<boost::mpl::void_> >' has incomplete
type
reverse.cpp: In instantiation of
`Reverse<boost::mpl::vector0<boost::mpl::void_> >':
reverse.cpp:21: instantiated from `Reverse<boost::mpl::vector1<long
int> >'
reverse.cpp:21: instantiated from `Reverse<boost::mpl::vector2<int,
long int> >'
reverse.cpp:21: instantiated from `Reverse<List>'
reverse.cpp:25: instantiated from here
reverse.cpp:15: no type named `type' in `struct
boost::mpl::pop_front<boost::mpl::vector0<boost::mpl::void_> >'
reverse.cpp:21: no type named `type' in `struct
boost::mpl::pop_front<boost::mpl::vector0<boost::mpl::void_> >'
reverse.cpp: In instantiation of `Reverse<boost::mpl::vector1<long int>
>':
reverse.cpp:21: instantiated from `Reverse<boost::mpl::vector2<int,
long int> >'
reverse.cpp:21: instantiated from `Reverse<List>'
reverse.cpp:25: instantiated from here
reverse.cpp:21: no type named `Type' in `struct
Reverse<boost::mpl::vector0<boost::mpl::void_> >'
reverse.cpp: In instantiation of `Reverse<boost::mpl::vector2<int, long
int> >':
reverse.cpp:21: instantiated from `Reverse<List>'
reverse.cpp:25: instantiated from here
reverse.cpp:21: no type named `Type' in `struct
Reverse<boost::mpl::vector1<long int> >'
reverse.cpp: In instantiation of `Reverse<List>':
reverse.cpp:25: instantiated from here
reverse.cpp:21: no type named `Type' in `struct
Reverse<boost::mpl::vector2<int, long int> >'
reverse.cpp:25: syntax error before `;' token
I cannot see why it reaches the point where it tries to instantiate
Reverse with an empty typelist - the apply_if should stop that (at least
that's my intention. Am I being a complete ass somewhere in this code
snippet? I've become blinded by now, so if anyone can point out what's
wrong I would greatly appreciate it.
Sincerely,
-- Tarjei
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net