2015-11-01 6 views
7

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?

+1

Argumentabhängige Lookup (ADL), a.ka.a Koenig Lookup (nach Andrew Koenig). –

+0

Ich öffne diese Frage wieder, weil jemand im Detail erklären möchte, warum der verlinkte Code nicht kompiliert wird –

+0

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

Antwort

4

Es ist nicht boost, sondern auf jeden namespace.

Mit argument-dependent lookup (ADL) werden Namespaces aus dem Argument zur Suche von Überladungen hinzugefügt.

So zum Beispiel:

add_edge(0, 1, g); 

g ist von Namespace boost, so suchen wir nach add_edge auch im Namensraum boost.

+2

Ich glaube nicht, dass dies wirklich beantwortet, warum das andere Codebeispiel, das vom OP verlinkt wird, nicht kompiliert. –

Verwandte Themen