友元函数是指在类定义中将一个函数声明为友元函数,使得该函数可以访问类的私有成员。ADL(Argument Dependent Lookup)是指在查找函数调用的过程中,编译器会考虑到参数类型所在的命名空间,从而扩展函数查找的范围。
下面是一个示例,展示了如何在类中定义友元函数,并结合ADL使用模板类型:
#include
// 声明模板类
template
class MyClass {
private:
T data;
public:
MyClass(T d) : data(d) {}
// 友元函数声明
friend void PrintData(const MyClass& obj);
};
// 定义友元函数
template
void PrintData(const MyClass& obj) {
std::cout << "Data: " << obj.data << std::endl;
}
int main() {
MyClass obj(42);
PrintData(obj);
return 0;
}
在上述示例中,我们定义了一个模板类MyClass
,其中包含一个私有成员变量data
。然后,我们在类的定义中声明了一个友元函数PrintData
,它可以访问MyClass
的私有成员。
在main
函数中,我们创建了一个MyClass
对象,并调用PrintData
函数来打印对象的数据。由于PrintData
是MyClass
的友元函数,并且PrintData
的参数类型与obj
的类型一致,因此编译器会使用ADL来查找并调用PrintData
函数。
输出结果为:
Data: 42
这说明我们成功地在类中定义了友元函数,并且在使用模板类型时也能正常调用。
上一篇:ADL和非类型模板参数