Здравствуйте, Аноним, Вы писали:
Добавлю, что переполнение стека возникает при попытке сконструировать объект
D d1 = D(d);
, а не при вызове apply_visitor
А>Почему-то попытка использовать рекурсивный тип с помощью boost::variant/boost::recursive_wrapper приводит к переполнению стека (пример кода — ниже).
А>А>#include <boost/variant.hpp>
А>#include <iostream>
А>using boost::apply_visitor;
А>using boost::variant;
А>using std::cout;
А>using std::endl;
А>struct A {};
А>struct B {};
А>struct C {};
А>struct D;
А>typedef variant<A,B,C,boost::recursive_wrapper<D> > ABCD;
А>struct D {
А> D() { v = A();}
А> D(const A& a) : v(a) { }
А> D(const B& b) : v(b) { }
А> D(const C& c) : v(c) { }
А> D(const D& d) : v(d) { }
А> ABCD v;
А>};
А>class MyVisitor : public boost::static_visitor<>
А>{
А>public:
А> void operator() (const A&) const
А> {
А> cout << "It's A!" << endl;
А> }
А> void operator() (const B&) const
А> {
А> cout << "It's B!" << endl;
А> }
А> void operator() (const C&) const
А> {
А> cout << "It's C!" << endl;
А> }
А> void operator() (const D& d) const
А> {
А> cout << "It's D->";
А> boost::apply_visitor( MyVisitor(), d.v );
А> }
А>};
А>int main()
А>{
А> A a = A();
А> D d = D(a);
А> D d1 = D(d);
А> ABCD v = d1;
А> boost::apply_visitor( MyVisitor(), v );
А> return 0;
А>}
А>
А>Буду благодарен за любые идеи — что не так?