Конструктор Boost Subgraph Copy не работает с Qt 5.0.2 и MinGW

0

Я использовал компилятор Qt 4.8 и minGW с boost 1.46.0 для моего проекта, но теперь я перешел в Qt 5.0.2 и компилятор MinGW с Boost 1.55.0, но конструктор копирования для подграфа работает не очень хорошо. Он не добавляет вершин к подграфу (показывает 0 элементов в списке вершин, если выполняется debug).

typedef boost::adjacency_list< boost::listS,
boost::vecS,
boost::bidirectionalS,
boost::property<boost::vertex_index_t, int ,
   property<vertex_position_t, point, VertexProperties> > ,
boost::property<boost::edge_index_t,int , EdgeProperties>,
boost::property<graph_custom_prop_t,GraphProperties> >
Graph;
typedef boost::subgraph< Graph > SubGraph;

Я вхожу в gMainGraph и мне нужно скопировать его в m_gMainGraph

SubGraph* m_gMainGraph;
m_gMainGraph = new SubGraph(gMainGraph);

Создаются подграфы, но вершины и ребра внутри подграфов не создаются и добавляются только к верхнему основному графу. Здесь в приведенном выше коде gMainGraph не получает глубокую скопированность в m_gMainGraph.

Теги:
qt
boost

1 ответ

0

Это часть работы для этой проблемы, поскольку конструктор копии субграфа не реализован для выполнения глубокой копии в boost 1_55_0. Я попытался обновить генератор подзаголовков. Просто используйте следующий код в вашем файле subgraph.hpp boost. Вам нужно прокомментировать код из 1.52.0 и использовать следующие изменения.

// copy constructor
/*Updated the copy constructor to work properly
    As it working in 1.46.0 and not in 1.52.0, In 1.52.0, the subgraph constructor  is not itrating the child of child subgraphs
    So only the direct children of main subgraph was getting copied*/
subgraph(const subgraph& x)
    : m_graph(x.m_graph), m_parent(x.m_parent), m_edge_counter(x.m_edge_counter)   //Added m_graph(x.m_graph)
    , m_global_vertex(x.m_global_vertex), m_global_edge(x.m_global_edge)
{
    // This loop belongs to 1.46.0
    for(typename ChildrenList::const_iterator i = x.m_children.begin();
        i != x.m_children.end(); ++i)
    {
        m_children.push_back(new subgraph<Graph>( **i ));
    }
    /* 1.52.0 code*/

    //        if(x.is_root())
    //        {
    //         m_graph = x.m_graph;
    //        }
    //        // Do a deep copy (recursive).
    //        // Only the root graph is copied, the subgraphs contain
    //        // only references to the global vertices they own.
    //        typename subgraph<Graph>::children_iterator i,i_end;
    //        boost::tie(i,i_end) = x.children();
    //        for(; i != i_end; ++i)
    //        {
    //         subgraph<Graph> child = this->create_subgraph();
    //         child = *i;
    //         vertex_iterator vi,vi_end;
    //         boost::tie(vi,vi_end) = vertices(*i);
    //         for (;vi!=vi_end;++vi)
    //         {
    //          add_vertex(*vi,child);
    //         }
    //       }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню