如果我们将类类型作为函数参数,则根据标准参数相关的查找添加到搜索集类:
如果
T
是类类型(包括联合),则其关联的类是:类本身;它所属的成员,如果有的话;及其直接和间接基类。
如果是这样,为什么在此上下文中找不到foo
:
class X{
public:
void foo(const X& ref){std::cout<<"Inner class method\n";}
};
int main(){
X x;
foo(x);
}
不应该将adp添加到搜索集X
类并在其中查找foo
吗?
答案 0 :(得分:4)
不,因为foo
是一个成员函数,而不是可以通过ADL找到的自由函数。
也许你的意思是:
static void foo(const X& ref){std::cout<<"Inner class method\n";}
这也不会通过ADL找到;您需要像X::foo(b)
一样限定通话。
关于关联类的子句用于在类中声明的友元函数。例如:
class X{
public:
friend void foo(const X& ref){std::cout<<"Inner class method\n";}
};
foo
是非成员函数,但只能通过ADL找到。
答案 1 :(得分:2)
foo
不是免费功能,它是一种类方法,因此您需要从类的实例中调用它
X a;
X b;
a.foo(b);
请注意,这里使用的是ADL,因此您不必写出以下内容,这也可以正常编译,但由于ADL而导致不必要的详细信息
a.X::foo(b);