#include <iostream>
template <typename T>
class TemplateClass {
private:
void privateFunc() {
std::cout << "This is privateFunc in TemplateClass." << std::endl;
}
friend class FriendClass;
};
class FriendClass {
public:
template <typename T>
void accessPrivateFunc(TemplateClass<T>& obj) {
obj.privateFunc();
}
};
友元类作用范围的界定
- 友元声明:在
TemplateClass
模板类中,通过friend class FriendClass;
声明FriendClass
为友元类,这使得FriendClass
的所有成员函数可以访问TemplateClass
实例化对象的私有成员(包括privateFunc
)。
- 作用范围:友元关系是针对具体的模板实例化类型而言的。例如,
TemplateClass<int>
实例化后的对象,FriendClass
可以访问其私有成员;而TemplateClass<double>
实例化后的对象,同样可以被FriendClass
访问私有成员。这是因为友元声明是针对整个TemplateClass
模板类,而不是针对特定的实例化类型分别声明。
可能遇到的问题及解决方法
- 问题:如果
FriendClass
也定义为模板类,如template <typename U> class FriendClass
,并且希望它能访问TemplateClass
的私有成员,那么在TemplateClass
中的友元声明就需要修改为template <typename U> friend class FriendClass;
。这种情况下,FriendClass
的不同实例化(如FriendClass<int>
和FriendClass<double>
)只能访问对应TemplateClass
相同类型实例化(如TemplateClass<int>
和TemplateClass<double>
)的私有成员,可能与原需求不符。
- 解决方法:保持
FriendClass
为非模板类,像上述代码实现的那样,这样一个FriendClass
可以访问TemplateClass
任何类型实例化对象的私有成员。同时,在FriendClass
的成员函数中通过模板参数来接受不同类型的TemplateClass
实例化对象,如accessPrivateFunc
函数模板。这样既满足了FriendClass
作为非模板类访问TemplateClass
私有成员的需求,又能处理不同类型的TemplateClass
实例化对象。