为什么范围分辨率不适用于此?

Meh*_*dad 1 c++ scope overloading scope-resolution visual-c++

这个函数bar()不能在这里重载的原因是什么?

namespace foo
{
    void bar(int) { }

    struct baz
    {
        static void bar()
        {
            // error C2660: 'foo::baz::bar' : function does not take 1 arguments
            bar(5); 
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

K-b*_*llo 5

它不能超载,因为它们处于不同的范围.第一个barfoo::bar第二个,而第二个是在foo::baz::bar.

这个名字bar来自外部命名空间是由新的声明隐藏.它必须被显式调用,或者通过using声明显示:

static void bar()
{
    using foo::bar;
    bar(5); 
}
Run Code Online (Sandbox Code Playgroud)

  • 编译器不能通过命中和试用工作.它的工作方式与您要求它的工作方式相同.它可以优化但不能代表您做出明智的决定.此外,由于函数的范围不同,编译器无法确定要使用的实现.考虑在两个以上的范围中定义了两个以上的bar函数.然后,编译器抛出错误而不是智能并选择可能适合或不适合您的实现更好. (2认同)