从模板化的类赋值运算符访问私有成员变量

ste*_*225 17 c++ templates

我有一个模板化的容器类.我正在重载赋值运算符,以便也可以分配派生类型.

我的问题是,当类型不一样时,我无法访问容器类的私有成员.获得访问权限的最佳方法是什么?无法通过公共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)

需要注意的是,如果TU是不同的类型,然后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.这就是这个类和上面的模板类之间的区别.