2015-11-01 78 views
7

前綴考慮這個代碼(或live example):爲什麼有些升壓功能不需要命名空間

#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; 
} 

爲什麼功能add_edgemake_iterator_rangeverticesdegreeadjacent_vertices是來自Boost庫工作不命名空間前綴boost::

最令我費解的是,根據情況,有時候實際需要前綴。 Here is an example,如果使用不同的圖形結構會導致編譯錯誤,可以通過在前綴boost::make_iterator_range前修復該錯誤。

我看了一下週圍的BGL documentation,但沒有發現任何關於這個問題。是我的錯,還是一些BGL標題污染了全局命名空間?這是設計還是這是一個錯誤?

+1

參數依賴查找(ADL),又名Koenig查找(在Andrew Koenig之後)。 –

+0

我重新打開這個問題,因爲有人可能想詳細解釋,爲什麼鏈接的代碼不能編譯 –

+0

儘管ADL有其他問題(這些問題很難找到,特別是沒有搜索術語ADL),這是一個非常好問的問題。可以改進的主要原因是所有的命名空間都會發生這種情況,而不是Boost,但是我可以通過不點擊來嘗試。 – chris

回答

4

它與boost無關,但與任何namespace

使用argument-dependent lookup(ADL),來自參數的名稱空間被添加到重載搜索中。

因此,例如:

add_edge(0, 1, g); 

g是從命名空間boost,所以我們尋找add_edge也命名空間boost

+2

我不認爲這真的解釋了爲什麼由OP鏈接的其他代碼示例沒有編譯。 –

相關問題