"Aleksey Gurtovoy" <[EMAIL PROTECTED]> wrote in message [EMAIL PROTECTED]">news:[EMAIL PROTECTED]... > [...] > > 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 _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost