C ++模板完整指南。分配运营商

时间:2016-04-21 06:18:29

标签: c++ templates operator-keyword assign

作为本书中的一个例子: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&); 
}; 

这是assign运算符的实现:

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()来从该副本中获取元素。

我对这部分感到困惑:

  

然而,这个堆栈有一个   不同的类型(如果您实例化两个不同的类模板   类型,你有两种不同的类型),所以你只能使用   公共界面。

这是否说我只允许使用公共接口,或者我不允许使用公共接口? 如果这意味着我不允许使用公共interfases,而不是top()成员函数?这不是一种公共方法吗?

2 个答案:

答案 0 :(得分:3)

如果Stack<T>

Stack<T2>T != T2是不相关的类型, 因此Stack<T>的方法无法使用Stack<T2>的私有成员(除非声明为friend)。

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

答案 1 :(得分:1)

  

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

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

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

是的, top()是公共功能