$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Andreas Huber (ahd6974-spamgroupstrap_at_[hidden])
Date: 2005-08-01 05:32:48
Hi there
I'm trying to address a point raised by Jonathan Turkanis during the
formal review of the statechart library. Basically, the problem boils
down to the following:
#include <boost/mpl/list.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/as_sequence.hpp>
namespace mpl = boost::mpl;
// InnerInitial is either an mpl sequence of types or a single type
template< class InnerInitial >
struct state
{
// stateArray_ must have a length equal to the number of types
// in InnerInitial
int stateArray_[
mpl::size<
typename mpl::as_sequence< InnerInitial >::type
>::type::value
];
};
// A is defined later, possibly in a different translation unit
struct A;
template< class X >
struct B
{
typedef typename X::reactions reactions;
};
int main()
{
// fine: instantiation with an incomplete type
state< A > a;
// fine: instantiation with an mpl sequence containing B< A >
state< mpl::list< B< A > > > b;
// error: mpl::as_sequence triggers the instantiation of B's member
// typedef, which tries to access the member typedef of A. A compile-
// time error results because A is still incomplete at this point.
state< B< A > > c; // *** here ***
return 0;
}
MSVC7.1 and GCC3.4 agree that the last state template instantiation is
illegal (use of undefined type A). I'm wondering whether there is any
way to make this legal (different as_sequence implementation, implement
the state template differently, etc.)?
Thanks & Regards,
-- Andreas Huber When replying by private email, please remove the words spam and trap from the address shown in the header.