|
Boost : |
From: Steven Watanabe (steven_at_[hidden])
Date: 2006-12-28 20:00:18
AMDG
"Richard Crossley" wrote:
>
> Cross posted from the boost users list... Can anyone help me out here?
>
> http://thread.gmane.org/gmane.comp.lib.boost.user/23608/focus=23608
>
> Regards,
>
> Richard.
>
Ok. I've finally figured out what's happening. It looks like
a compiler bug introduced in sp1. Here is the simplest
I could reduce it to.
struct undefined;
template<class T>
void f(T) {
}
template<class T>
struct A {
};
template<class T>
struct B {
};
template<class T>
struct C {
T t;
};
int main() {
f((A<B<C<undefined> > >*)0);
}
This causes msvc to instantiate C<undefined>. Note that
just B<C<undefined> > is not enough. All three templates
are needed. Qualifying the call to f fixes the problem, so
this bug appears to be caused by ADL.
Now for your problem. The function calls that need to be qualified
are visitation_impl_invoke and visitation_impl_invoke_impl
in <boost/variant/detail/visitation_impl.hpp>. When I tried that
it compiled.
Until this is fixed you can use recursive_wrapper directly.
struct my_map;
typedef boost::variant<int, boost::recursive_wrapper<my_map> > element;
struct my_map : std::map<float, element> {
my_map(const std::map<float, element>& arg) : std::map<float,
element>(arg) {}
friend std::ostream& operator<<(std::ostream& os, const my_map& self) {
os << static_cast<const std::map<float, element>&>(self);
}
};
In Christ,
Steven Watanabe
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk