簡體   English   中英

沒有缺少C ++中的命名空間限定符的錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM