如何在允许ADL等的同时调用其他具有相同名称的函数

时间:2014-12-05 12:31:21

标签: c++

如何在第二个f()中进行调用,找到具有非限定查找的第一个f(),以便ADL和普通名称查找规则仍可用?

注意:我不想更改任何功能的名称。

namespace x 
{
    void f()
    {
    }

    class C 
    {
        void f() 
        {
            x::f();
        }
    };
}

2 个答案:

答案 0 :(得分:2)

只需引入功能:

void f()
{
    using x::f;
    f(); // calls x::f()
}

这样做的原因是,复制Mike Seymour's answer

  

因为using声明将x :: f带入f的范围,该范围比C的范围窄。不合格的查找会考虑本地块范围,找到匹配,并在考虑更宽的类范围之前停止。由于没有函数参数,因此没有依赖于参数的查找,因此不会考虑其他范围。

答案 1 :(得分:0)

您可以创建一个包装器:

namespace x
{
  void f()
  {
  }

  void call_f()
  {
    f();
  }

  class C
  {
    void f()
    {
      call_f();
    }
  };
}