在C ++中,为什么我可以访问没有命名空间限定符的命名空间中定义的函数

问题描述

我有一个名字ns。在ns中,我定义了一个类和一个函数。我进一步将函数定义为该类的朋友,以便该函数可以访问该类的私有变量。在主程序中,我成功调用了该函数,而未使用ns ::对其进行限定。有关详细信息,请参见代码

#include <iostream>

namespace ns {
    class MyClass;
    void print_fn(const MyClass & c);
}

namespace ns {
    class MyClass {
    private:
        int _a;
    public:
        MyClass(int a): _a(a) {}

        friend void print_fn(const MyClass & c);
    };

    void print_fn(const MyClass & c){
        std::cout << c._a << std::endl;
    }
}


int main()
{
    ns::MyClass c(10);
    print_fn(c);

    return 0;
}

解决方法

这称为参数依赖查找。

编译器在声明其参数的名称空间中搜索该函数。

您可以通过以下方式禁用与参数相关的查找

 ( print_fn )(c);

在这种情况下,编译器会发出错误消息,找不到函数print_fn