C++模板完整指南.分配运算符

C++ Templates the complete guide. Assign operator

本文关键字:分配 运算符 C++      更新时间:2023-10-16

作为本书中的一个例子:http://www.amazon.com/C-Templates-The-Complete-Guide/dp/0201734842 他们有这个类:

template <typename T> 
class Stack { 
 private: 
 std::deque<T> elems; // elements
 public: 
 void push(T const&); // push element
 void pop(); // pop element
 T top() const; // return top element
 bool empty() const { // return whether the stack is empty
 return elems.empty(); 
 } 
 // assign stack of elements of type T2 
 template <typename T2> 
 Stack<T>& operator= (Stack<T2> const&); 
}; 

这是分配运算符的实现:

template <typename T> 
 template <typename T2> 
Stack<T>& Stack<T>::operator= (Stack<T2> const& op2) 
{ 
 if ((void*)this == (void*)&op2) { // assignment to itself?
 return *this; 
 } 
 Stack<T2> tmp(op2); // create a copy of the assigned stack
 elems.clear(); // remove existing elements
 while (!tmp.empty()) { // copy all elements
 elems.push_front(tmp.top()); 
 tmp.pop(); 
 } 
 return *this; 
} 

以下是有关该方法功能的一些解释:

在成员函数中,您可能期望简单地访问所有 分配的堆栈 OP2 的必要数据。 但是,此堆栈具有 不同的类型(如果为两个不同的类模板实例化 类型,你得到两种不同的类型(,所以你只能使用 公共接口。因此,访问 元素是通过调用 top(( 来实现的。但是,每个元素都必须成为一个 那么,顶级元素。因此,必须首先制作 op2 的副本,以便 元素通过调用 pop(( 从该副本中获取。

我对这部分感到困惑:

但是,此堆栈具有 不同的类型(如果为两个不同的类模板实例化 类型,你得到两种不同的类型(,所以你只能使用 公共接口。

这是否说我只被允许使用公共接口,或者我不允许使用公共接口?如果这意味着我不允许使用公共交互,那么什么是 top(( 成员函数?这不是一种公共方法吗?

如果

T != T2Stack<T>Stack<T2>是不相关的类型,所以Stack<T>方法不能使用Stack<T2>的私有成员(除非声明为 friend (。

Stack<T>(与任何其他类一样(仅限于使用 Stack<T2> 的公共接口。

但是,此堆栈具有不同的类型(如果实例化两种不同类型的类模板,则会获得两种不同的类型(,因此只能使用公共接口。

这意味着您应该只使用公共接口。事实上,如果你想实现 operator= 函数,那么你必须只使用公共接口。

如果您不使用公共接口,您将无法访问 top(( 函数,这是将堆栈的元素分配给另一个堆栈的唯一方法。

是的,top(( 是一个公共函数