为什么“xxx::function();” 不起作用,但“使用名称空间 xxx; function();” 做?

bad*_*oul 3 c++ boost namespaces boost-graph argument-dependent-lookup

我正在使用 Boost 的图 C++ 库,在询问网格图的顶点数时我偶然发现了一个问题。

\n

下面的代码片段创建了一个形状为 5 x 6 的二维网格图,然后打印该图的顶点数,即5x6 = 30。\n但是,这不会编译并出现错误:

\n
\n

错误:\xe2\x80\x98num_vertices\xe2\x80\x99 不是 \xe2\x80\x98boost\xe2\x80\x99 的成员

\n
\n
#include <boost/graph/grid_graph.hpp>\n#include <iostream>\n\nint main()\n{\n    typedef boost::grid_graph<2> Graph;\n    Graph g({5, 6});\n    std::cout << "Num vertices: " << boost::num_vertices(g) << std::endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我将代码更改为包含using namespace boost;在开头,那么它确实有效:

\n
#include <boost/graph/grid_graph.hpp>\n#include <iostream>\n\nusing namespace boost;\n\nint main()\n{\n    typedef grid_graph<2> Graph;\n    Graph g({5, 6});\n    std::cout << "Num vertices: " << num_vertices(g) << std::endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

奇怪的是,当我使用不同的 Boost 图类型(例如boost::adjacency_list<>.

\n

所以我有三个问题:

\n
    \n
  1. 命名空间的哪种操作原理导致了这种行为?

    \n
  2. \n
  3. 关于 Boost 中网格图实现的特殊情况:这是一个错误还是这是预期的行为?

    \n
  4. \n
  5. 有什么方法可以num_vertices在没有指令的情况下调用该函数using吗?

    \n
  6. \n
\n

Art*_*yer 5

根据https://www.boost.org/doc/libs/1_82_0/libs/graph/doc/VertexListGraph.html,该函数必须调用为num_vertices(g).

它可能被实现为“隐藏友元函数”,这意味着它只能通过依赖于参数的查找来找到。