добавлена ​​библиотека графов - PullRequest
1 голос
/ 25 июня 2019

Я использую Boost 1.70.0 с vs-2017. При использовании depth_first_search я заметил, что функция finish_edge в посетителе не вызывается при компиляции с помощью компилятора msvc. С gcc (8.3) функция finish_edge вызывается правильно

пример кода:

struct DfsVisitor : public boost::default_dfs_visitor
{
    template <class Graph>
    void
    finish_edge(typename Graph::edge_descriptor ed, const Graph& g)
    {
        std::cout << "Finish edge " << boost::source(ed, g) << "->" << boost::target(ed, g) << std::endl;
    }
};

DfsVisitor dfs;
boost::depth_first_search(g, boost::visitor(dfs)); // g is graph, adjacency_list

1 Ответ

0 голосов
/ 26 июня 2019

У вас есть SSCCE, который мы можем запустить для наблюдения за поведением? Это сэкономит много времени

Я только что сделал это: Просто сделал это: repro Повышение 1.60 на MSVC

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <iostream>

struct DfsVisitor : public boost::default_dfs_visitor {
    template <class Graph> void finish_edge(typename Graph::edge_descriptor ed, const Graph &g) {
        std::cout << "Finish edge " << boost::source(ed, g) << "->" << boost::target(ed, g) << std::endl;
    }
};

int main() {
    boost::adjacency_list<> g(4);
    add_edge(0,1,g);
    add_edge(1,2,g);
    add_edge(2,3,g);

    DfsVisitor dfs;
    boost::depth_first_search(g, boost::visitor(dfs));

    std::cout << "Done\n";
}

Просто печатает:

Done

Для сравнения

Так что, очевидно, это больше связано с буст-версией, чем с компилятором. Godbolt не идет дальше, чем Boost 1.64 (все еще в порядке: https://godbolt.org/z/Ld8-8d), но wandbox делает:

Проверка замечаний к выпуску для Boost 1.62.0 , кажется, не упоминает что-то, но использование истории github действительно раскрывает:

$ git clone https://github.com/boostorg/graph
$ cd graph
$ git log --oneline --graph --left-right --cherry-pick boost-1.61.0...boost-1.62.0 | grep -i finish
> a14f8df8 Fixed bug 10231 partly: If finish_edge was called, then now correctly. (#16)
> d6b7a717 Add finish_edge test case from Alex Lauser.
> 6a2d45ae Condition TTI finish_edge on supported compilers.
> 0e1414f4 Fix type traits so finish_edge is called when defined.
...