代码之家  ›  专栏  ›  技术社区  ›  shir k

使用命名空间重载函数(&O)

  •  3
  • shir k  · 技术社区  · 6 年前

    我不明白为什么会出现错误“对重载函数的调用不明确”。 在“main”之前,我声明使用名称空间“second”。 我的预期输出是:

    这是第一个foo
    这是第二个foo
    这是第二个foo

    #include <iostream>
    using namespace std;
    
    namespace first {
        void foo() {
            cout << "this is the first foo" << endl;
        }
    }
    
    namespace second {
        void foo() {
            cout << "this is the second foo" << endl;
        }
    }
    
    
    void foo() {
        cout << "this is just foo" << endl;
    }
    
    
    using namespace second;
    void main() {
        first::foo();
        second::foo();
        foo();
    }
    
    4 回复  |  直到 6 年前
        1
  •  3
  •   songyuanyao    6 年前

    在“main”之前,我声明使用名称空间“second”。

    当你这么做的时候, second::foo 被引入全局命名空间,然后用于 foo(); 二者都 第二名::foo ::foo 是有效的候选人。

    您可以指定要调用全局 foo 明确地,即。

    ::foo();
    

    或使用 using-declaration 在…内 main() 而不是 using-directive ,例如。

    int main() {
        using second::foo;
        first::foo();
        second::foo();
        foo();
    }
    
        2
  •  2
  •   Carl    6 年前

    发生这种情况的原因是: using namespace second;

    执行此操作时,您将限定函数 foo() second 命名空间进入全局范围。在全局范围内,存在另一个函数 foo() 签名完全相同。现在,您的呼叫 first::foo() second::foo() 都很好。然而,当你打电话给 foo() ,编译器不知道是否应该调用 foo() 第二个::foo() 因为它们是不明确的,此时它们都在全局命名空间中。

        3
  •  1
  •   Christian Hackl    6 年前

    你的 using namespace second; 这正是你出错的原因。它实际上告诉编译器 second::foo 就像它在全局命名空间中一样。现在你有两个 foo 在那里。

    顺便说一句 void main 不是有效的C++。一定是这样 int main

        4
  •  1
  •   Achal    6 年前

    首先,更换 void main() { } 具有

    int main() {
    
     return 0;
    }
    

    其次 using namespace second; 应该在里面 main() 从您要呼叫的特定位置 namespace ,而不是全局。

    最后,如果您使用 ::scope resolution operator 那你就不用提了 using namespace second 在main()中,使用任意一个。

    就像下面这样

    int main() {
            first::foo(); /* first foo will be called */
            second::foo(); /* second foo() will be called */
            foo(); /* global foo() will be called */
            return 0;
    }