我有一个模板化的容器类.我正在重载赋值运算符,以便也可以分配派生类型.
我的问题是,当类型不一样时,我无法访问容器类的私有成员.获得访问权限的最佳方法是什么?无法通过公共getter访问成员变量.谢谢!
示例代码:
// Note: var is private
template <class T>
Container<T>& Container<T>::operator=(const Container<T>& rhs) {
if(*this != rhs) var = rhs.var; // works for same type
return *this;
}
template <class T>
template <typename U>
Container<T>& Container<T>::operator=(const Container<U>& rhs) {
if(*this != rhs) var = rhs.var; // does NOT work for different types
return *this;
}
Run Code Online (Sandbox Code Playgroud)
Naw*_*waz 21
由于您要访问使用不同类型实例化的模板类的私有成员,因此您必须将其他模板作为模板类的朋友,如下所示:
template <class T>
class Container
{
template<class U>
friend class Container;
};
Run Code Online (Sandbox Code Playgroud)
需要注意的是,如果T和U是不同的类型,然后Container<T>和Container<U>是两个完全不同的类; 如果你不交朋友,就不能访问其他私人成员.
还要注意的是,在上面的代码中所有实例化类模板的是朋友彼此.也就是说,如果你初始化它char,int,short,则
Container<int>将两个朋友Container<char>和Container<short>.Container<char>将两个朋友Container<int>和Container<short>.Container<short>将两个朋友Container<int>和Container<char>.这里有趣的一句是:"彼此的朋友".通常这不会发生.例如,如果您有这样的类:
class A
{
friend class B;
};
Run Code Online (Sandbox Code Playgroud)
那么这里只有B朋友A.A不是的朋友B.他们不是"彼此的朋友".B可以访问私有成员A,但A无法访问私有成员B.这就是这个类和上面的模板类之间的区别.
| 归档时间: |
|
| 查看次数: |
3796 次 |
| 最近记录: |