Re: Stack overflow при использовании boost::recursive_wrappe
От: sanok  
Дата: 05.04.10 11:56
Оценка:
Здравствуйте, Аноним, Вы писали:

Добавлю, что переполнение стека возникает при попытке сконструировать объект
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;
А>}

А>


А>Буду благодарен за любые идеи — что не так?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.