|
Boost : |
From: David B. Held (dheld_at_[hidden])
Date: 2002-11-27 21:30:24
"Aleksey Gurtovoy" <agurtovoy_at_[hidden]> wrote in message
news:4034600A4760D411B8720001031D84FB01096568_at_postoffice.office.meta...
> [...]
> > but is this documented?
>
> Now it is :). Speaking seriously, it's on my documentation to-do list.
;)
Now, for a real stumper. It seems to me that VC6 is only pretending to
compile MPL::Lambda. The reason being that it refuses to recognize
nested types that have passed through lambda. Here's what I think is
the relevant code:
template <class F, typename T>
struct apply_lambda
{
typedef typename mpl::lambda<F>::type f_;
typedef typename mpl::apply1<f_, T>::type type;
};
template <class Policy>
struct get_category
{
typedef typename Policy::policy_category type;
};
template <class Sequence, class Category, class Default>
struct get_policy
{
typedef typename mpl::find_if<
Sequence, is_same<get_category<_>, Category>
>::type iter_;
typedef typename mpl::end<Sequence>::type last_;
typedef typename mpl::apply_if<
typename is_same<iter_, last_>::type,
mpl::identity<Default>, iter_
>::type type;
};
// decided to make this a class, because it seems to
// work better
template <typename T, class Policies>
struct storage_policy_
{
typedef typename apply_lambda<
typename get_policy<
Policies, storage_policy_tag, scalar_storage<_>
>::type, T
>::type type;
};
Now, inside smart_ptr...
typedef typename storage_policy_<T, policies_>::type storage_policy;
typedef storage_policy::pointer_type pointer_type;
VC6 really doesn't like the second typedef. It says:
error C2039: 'pointer_type' : is not a member of '`global namespace''
error C2146: syntax error : missing ';' before identifier 'pointer_type'
error C2868: 'pointer_type' : illegal syntax for using-declaration;
expected qualified-name
If I change the second typedef to this:
typedef storage_policy_<T, policies_>::type::pointer_type pointer_type;
the first error switches to:
error C2510: 'type' : left of '::' must be a class/struct/union
and the others remain the same. I included all three error messages in
case it gives you an idea what might be happening. I thought maybe MPL
was not actually performing the type manipulations correctly (in find_if,
etc.), so I put a typedef int* pointer_type; in empty_policy (which I
thought
might have been selected). No effect. If I add the line:
typedef type::pointer_type pointer_type;
to storage_policy_<>, I simply move the error up to that location. So it's
hard to tell if the types are really making it all the way through Lambda or
not. I know it's not easy to debug this without seeing all the code, but if
you need to see it, I just committed the latest stuff to the sandbox (under
policy_ptr). Thanks for any insight you can provide.
Dave
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk