虽然不同的命名空间,但重载函数的调用是模糊的

Lyc*_*osa 4 c++ ambiguous

我明白为什么如果没有使用名称空间,以下将是一个问题.这个电话确实很模糊.我想"使用stD :: swap;" 将定义使用哪种方法.

为什么它适用于"int"而不是"class"?

    #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);
        }
    };

    }
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

    ../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){};
          ^
Run Code Online (Sandbox Code Playgroud)

我非常感谢你提前回答.

Cor*_*mer 7

此行使用参数依赖查找

TEST::Dummy x;
swap(x);
Run Code Online (Sandbox Code Playgroud)

所以它既可以找到void stD::swap(TEST::Dummy),也可以void TEST::swap(TEST::Dummy)因为x携带TEST::命名空间.

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