【问题标题】:Call of overloaded function is ambiguous although different namespace尽管命名空间不同,但重载函数的调用不明确
【发布时间】:2017-10-10 13:26:50
【问题描述】:

我明白如果不使用命名空间,为什么会出现以下问题。这个电话确实是模棱两可的。我想“使用stD::swap;”将定义要使用的方法。

为什么它适用于“int”而不适用于“类”?

    #include <memory>

    namespace TEST {

    class Dummy{};

    void swap(Dummy a){};
    void sw(int x){};

    }

    namespace stD {

    void swap(TEST::Dummy a){};
    void sw(int x){};

    class aClass{
    public:
        void F()
        {
            using stD::swap;
            TEST::Dummy x;
            swap(x);
        }

        void I()
        {
            using stD::sw;
            int b = 0;
            sw(b);
        }
    };

    }

这是错误信息:

    ../src/Test.h: In member function ‘void stD::aClass::F()’:
    ../src/Test.h:26:9: error: call of overloaded ‘swap(TEST::Dummy&)’ is ambiguous
       swap(x);
             ^
    ../src/Test.h:26:9: note: candidates are:
    ../src/Test.h:17:6: note: void stD::swap(TEST::Dummy)
     void swap(TEST::Dummy a){};
          ^
    ../src/Test.h:10:6: note: void TEST::swap(TEST::Dummy)
     void swap(Dummy a){};
          ^

非常感谢您的答复。

【问题讨论】:

    标签: c++ ambiguous


    【解决方案1】:

    此行使用argument dependent lookup

    TEST::Dummy x;
    swap(x);
    

    所以它会同时找到void stD::swap(TEST::Dummy)void TEST::swap(TEST::Dummy),因为x 带有TEST:: 命名空间。

    在后一种情况下,int b = 0; 变量 b 不在命名空间中,因此由于您的 using 语句,唯一要调用的有效函数是 stD::sw

    【讨论】:

    • 可能值得一提的是,如果F 不在stD 中,它会调用TEST::swap
    • 谢谢!这完全回答了我的问题。现在我很清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多