Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在仍然允许ADL等的情况下调用其他同名函数_C++ - Fatal编程技术网

C++ 如何在仍然允许ADL等的情况下调用其他同名函数

C++ 如何在仍然允许ADL等的情况下调用其他同名函数,c++,C++,如何在第二个f()中进行调用,找到第一个f()进行非限定查找,以便ADL和正常名称查找规则仍能工作 注意:我不想更改任何函数的名称 namespace x { void f() { } class C { void f() { x::f(); } }; } 只需引入以下功能: void f() { using x::f; f(); // calls x

如何在第二个
f()
中进行调用,找到第一个
f()
进行非限定查找,以便ADL和正常名称查找规则仍能工作

注意:我不想更改任何函数的名称

namespace x 
{
    void f()
    {
    }

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

只需引入以下功能:

void f()
{
    using x::f;
    f(); // calls x::f()
}
之所以这样做,是因为要复制:

因为using声明将x::f引入了f的范围,而f的范围比C的范围窄。非限定查找会考虑本地块范围,找到匹配项,并在考虑更宽的类范围之前停止。由于没有函数参数,因此不存在依赖于参数的查找,因此不考虑其他作用域


您可以创建一个包装器:

namespace x
{
  void f()
  {
  }

  void call_f()
  {
    f();
  }

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

::f()
不起作用?@barakmanos“使用非限定查找,因此ADL和正常名称查找规则仍能起作用”,这让我非常惊讶。我本以为这会导致一个模棱两可的电话。你能解释一下为什么没有发生吗?说实话,我也很惊讶。我正试图在标准中找到某种东西来区分这两个电话,但我做不到。对我来说,这似乎是一个萌芽的问题。除非你愿意,否则我会问的。@Angew我会问的。在这一点上,我像30分钟的超载解决方案,但仍然没有得到什么,所以现在我真的想知道。