2015-11-01 24 views
7

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?

+1

Ricerca argomento dipendente (ADL), a.k.a. Ricerca di Koenig (dopo Andrew Koenig). –

+0

Sto riaprendo questa domanda perché qualcuno potrebbe voler spiegare in dettaglio, perché il codice collegato non compila –

+0

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

risposta

4

Non è collegato a boost ma a qualsiasi namespace.

Con argument-dependent lookup (ADL), gli spazi dei nomi dall'argomento vengono aggiunti alla ricerca di sovraccarichi.

Così, per esempio:

add_edge(0, 1, g); 

g da namespace boost, quindi siamo alla ricerca di add_edge anche nel namespace boost.

+2

Non penso che questo davvero risponda perché l'altro esempio di codice collegato dall'OP non viene compilato. –

Problemi correlati