Si consideri questo codice (o il live example):Perché alcune funzioni Boost non hanno bisogno di prefisso con namespace
#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;
}
Perché funzioni add_edge
, make_iterator_range
, vertices
, degree
e adjacent_vertices
che provengono dal lavoro libreria Boost senza il prefisso dello spazio dei nomi boost::
?
Ciò che mi sorprende di più è che a seconda della situazione, il prefisso è effettivamente necessario a volte. Here is an example, quando si utilizza una struttura del grafico diversa, si ottiene un errore di compilazione che può essere risolto con il prefisso boost::make_iterator_range
.
Ho guardato un po 'il BGL documentation, ma non ho trovato nulla riguardo questo problema. È colpa mia o ci sono alcune intestazioni BGL che inquinano lo spazio dei nomi globale? È questo design o è un bug?
Ricerca argomento dipendente (ADL), a.k.a. Ricerca di Koenig (dopo Andrew Koenig). –
Sto riaprendo questa domanda perché qualcuno potrebbe voler spiegare in dettaglio, perché il codice collegato non compila –
Nonostante ci siano altre domande su ADL (che sono abbastanza difficili da trovare, specialmente senza cercare il termine ADL), questo è una domanda molto ben fatta. La cosa principale che può essere migliorata è che questo accade con tutti gli spazi dei nomi piuttosto che con Boost, ma riesco a guardarlo oltre facendo clic per provarlo. – chris