【问题标题】:Why doesn't scope-resolution work here?为什么范围解析在这里不起作用?
【发布时间】:2011-12-14 13:25:36
【问题描述】:

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

namespace foo
{
    void bar(int) { }

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

【问题讨论】:

    标签: c++ visual-c++ scope overloading scope-resolution


    【解决方案1】:

    它不能被重载,因为它们在不同的范围内。第一个bar 位于foo::bar,而第二个位于foo::baz::bar

    来自外部命名空间的名称bar 被新声明隐藏。它必须要么显式调用,要么通过 using 声明使其可见:

    static void bar()
    {
        using foo::bar;
        bar(5); 
    }
    

    【讨论】:

    • 对,但是失败不能告诉编译器它应该继续搜索吗?为什么不尝试其他方法就失败了?
    • 编译器不能通过点击和试用来工作。它按照您要求的方式工作。它可以优化但不能代表您做出明智的决定。此外,由于函数的范围不同,编译器无法确定要使用的实现。考虑您在两个以上的范围内定义了两个以上的 bar 函数。那么编译器最好抛出一个错误,而不是聪明地选择一个可能适合也可能不适合你的实现。
    • 啊,我刚刚意识到,如果编译器这样做,它将允许劫持成员函数,因为隐式转换可能会导致本地匹配比全局匹配更差。我认为提及这一点也可能是个好主意。
    • @krammer: Compiler doesn't work by hit and trial. --> SFINAE?
    【解决方案2】:

    这是你想要做的吗?

    namespace foo
    {
        void bar(int) { }
    
        struct baz
        {
            static void bar()
            {
                // error C2660: 'foo::baz::bar' : function does not take 1 arguments
                foo::bar(5); // <-- changed
            }
        };
    }
    

    编辑:这显然也不会超载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2013-05-16
      • 2019-02-10
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多