命名空间搜索顺序

Dav*_*ria 7 c++

我有两个名称空间,每个名称空间都有一个具有相同名称的函数.如果从其中一个命名空间我想调用匹配最佳的函数.从NamespaceA中的函数,如果我调用MyFunction(...),当然它使用NamespaceA中的函数.但是,如果我添加一个'using NamespaceB :: MyFunction',我会期待我描述的行为.但是,我实际看到的是它总是找到NamespaceB函数,即使我在NamespaceA中.但是,如果我还添加了一个using :: NamespaceA(尽管我已经在NamespaceA中),它可以像我期望的那样工作.下面是一个演示.谁能解释一下这是如何工作的?

#include <iostream>

namespace NamespaceA
{
  void DoSomething();
  void MyFunction(int object);
}

namespace NamespaceB
{
  void MyFunction(float object);
}

namespace NamespaceA
{
  void DoSomething()
  {
    using NamespaceA::MyFunction; // Note that without this line the lookup always fins the NamespaceB::MyFunction!
    using NamespaceB::MyFunction;

    MyFunction(1);
    MyFunction(2.0f);
  }

  void MyFunction(int object)
  {
    std::cout << "int: " << object << std::endl;
  }
}

namespace NamespaceB
{
  void MyFunction(float object)
  {
    std::cout << "float: " << object << std::endl;
  }
}

int main(int argc, char *argv[])
{
  NamespaceA::DoSomething();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ran 0

我相信命名空间使用与变量相同的作用域规则。因此,如果您有本地命名空间,则在移动到外部作用域之前将首先在那里进行查找。

我不确定导入两个具有相同函数名称的命名空间的情况的规则是什么,但为了清楚起见,您应该始终完全限定该场景中的函数调用,而不是依赖于语言实现的一些细微差别对于人们可能不熟悉的命名空间。