命名空间自动检测 - 场景背后的内容是什么?

时间:2018-03-30 13:48:47

标签: c++ namespaces argument-dependent-lookup

C ++是否会从不同的命名空间中重载所有相同名称的函数,并自动检测哪一个用于您?例如,以下代码调用函数 Concat 而不指定其名称空间:

namespace nsA {
    class A { public: A(std::string s): val(s) {}; std::string val; };
    void Concat(A &aa, A &a1, A &a2) { aa = A(a1.val + a2.val); }
};

namespace nsB {
    class B: public nsA::A { public: B(std::string s): nsA::A(s + " ") {} };
    void Concat(B &bb, B &b1, B &b2) { bb = B(b1.val + b2.val + "!"); }
};

void main() {
    nsA::A a1("Hello"), a2("World"), aa("");
    nsB::B b1("Hello"), b2("World"), bb("");
    Concat(aa, a1, a2); Concat(bb, b1, b2); // namespace not specified
    std::cout << aa.val << std::endl << bb.val << std::endl;
}

主要功能的输出:

HelloWorld
Hello World ! 

如果没有使用命名空间,而不使用 namespace :: function 调用函数,为什么它可以工作?即使它有效,是否有更好的做法来重载来自不同类和命名空间的函数?

0 个答案:

没有答案