diesem Code Betrachten Sie (oder die live example):Warum einige Boost-Funktionen müssen nicht mit Namespace prefixing
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/range/iterator_range.hpp>
using std::cout;
int main() {
boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> g;
add_edge(0, 1, g);
add_edge(1, 2, g);
for(auto v : make_iterator_range(vertices(g))) {
cout << v << " has " << degree(v, g) << " neighbor(s): ";
for(auto w : make_iterator_range(adjacent_vertices(v, g))) cout << w << ' ';
cout << '\n';
}
return 0;
}
Warum Funktionen add_edge
, make_iterator_range
, vertices
, degree
und adjacent_vertices
, die ohne die Boost-Bibliothek Arbeit kommen das boost::
Namespacepräfix?
Was mir am meisten rätselhaft ist, ist, dass je nach Situation manchmal das Präfix benötigt wird. Here is an example, wenn eine andere Grafikstruktur verwendet wird, führt dies zu einem Kompilierungsfehler, der durch Voranstellen von boost::make_iterator_range
behoben werden kann.
Ich schaute ein wenig um die BGL documentation, aber fand nichts in Bezug auf dieses Problem. Ist es meine Schuld oder verschmutzen einige BGL-Header den globalen Namespace? Ist das Absicht oder ist das ein Fehler?
Argumentabhängige Lookup (ADL), a.ka.a Koenig Lookup (nach Andrew Koenig). –
Ich öffne diese Frage wieder, weil jemand im Detail erklären möchte, warum der verlinkte Code nicht kompiliert wird –
Trotz anderer Fragen zu ADL (die schwer zu finden sind, insbesondere ohne den Begriff ADL zu suchen), ist dies der Fall eine sehr gut gestellte Frage. Die Hauptsache, die verbessert werden kann, ist, dass dies mit allen Namespaces und nicht mit Boost geschieht, aber ich kann darüber hinwegsehen und nicht klicken, um das zu versuchen. – chris