[英]no error on lack of namespace qualifiers in C++
我正在研究一個小型C ++項目,並且遇到了一些關於命名空間的行為,這些行為對我來說似乎很奇怪。 我已經在名稱空間my_project
定義了我的所有類和函數:
// point.hpp:
namespace my_project {
template <size_t dim> class Point { /* snip */ };
}
// convex_hull.hpp:
namespace my_project {
std::vector<size_t> convex_hull(const std::vector<Point<2> >& xs);
}
然后,我去為所有內容編寫測試:
// convex_hull_test.cpp:
#include <my_project/convex_hull.hpp>
using my_project::Point;
int main()
{
Point<2> p1 = /* snip */;
std::vector<Point<2> > xs = {p1, p2, p3, p4, p5, p6};
std::vector<size_t> hull = convex_hull(xs);
/* snip */
return 0;
}
一切都很好,但是第二天我再次看了一下,意識到我應該寫這行:
std::vector<size_t> hull = my_project::convex_hull(xs);
因為我從沒在任何地方using my_project::convex_hull
。 但是,當我編譯此符號時,使用未定義符號沒有任何錯誤。 為什么我可以在沒有名稱空間前綴的情況下使用此功能 ?
對於我定義的其他幾個函數也是如此。 當我using my_project::Point;
下線時 我確實在使用沒有命名空間限定的Point
出錯。 關於名稱空間限定的功能,類或模板是否有不同的規則? 規則是否相同,表明還有其他奇怪的事情要發生?
我在多台計算機上使用clang,g ++和icc進行了嘗試。 我試圖構造一個最小的測試用例,但是編譯器拋出了我認為在這種情況下應該出現的錯誤。
xs
的類型必須在名稱空間my_project
可用。 發生的事情稱為依賴參數的查找 。
C ++標准允許它。 如果要防止ADL,請嘗試
std::vector<size_t> hull = (convex_hull)(xs);
加上括號可防止依賴於參數的查找,請嘗試編譯器進行投訴。
編輯: 基於OP的編輯
請參閱Alan Stokes對這個答案的評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.