C++ C++;模板是完整的指南。指派操作员

C++ C++;模板是完整的指南。指派操作员,c++,templates,operator-keyword,assign,C++,Templates,Operator Keyword,Assign,本书中的一个例子是:他们有这样一个类: 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() con

本书中的一个例子是:他们有这样一个类:

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&); 
}; 
模板
类堆栈{
私人:
std::deque elems;//元素
公众:
void push(T const&);//push元素
void pop();//pop元素
T top()const;//返回top元素
bool empty()常量{//返回堆栈是否为空
返回elems.empty();
} 
//分配T2类型元素的堆栈
模板
堆栈和运算符=(堆栈常量&);
}; 
下面是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)
{ 
如果((void*)this==(void*)&op2){//分配给自身?
归还*这个;
} 
堆栈tmp(op2);//创建指定堆栈的副本
elems.clear();//删除现有元素
而(!tmp.empty()){//复制所有元素
元素向前推(tmp.top());
tmp.pop();
} 
归还*这个;
} 
下面是关于该方法的一些解释:

在成员函数中,您可能只希望访问所有 指定堆栈op2的必要数据。但是,此堆栈具有 不同类型(如果您为两个不同的 类型,您会得到两种不同的类型),因此您只能使用 公共界面。因此,访问 元素是通过调用top()实现的。但是,每个元素都必须成为一个 那就上元素吧。因此,必须首先制作op2的副本,以便 通过调用pop()从该副本获取元素

我对这部分感到困惑:

但是,此堆栈具有 不同类型(如果您为两个不同的 类型,您会得到两种不同的类型),因此您只能使用 公共界面

这是说我只能使用公共接口,还是不允许使用公共接口? 如果这意味着不允许我使用public interface,那么什么是top()成员函数?这不是一种公共方法吗

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

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

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

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

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

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

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

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

堆栈
,如果
T!=T2
, 因此,
Stack
的方法不能使用
Stack
的私有成员(除非声明为
friend

Stack
(与任何其他类一样)仅限于使用
Stack

Stack
的公共接口,如果
T!=T2
, 因此,
Stack
的方法不能使用
Stack
的私有成员(除非声明为
friend


Stack
(与任何其他类一样)仅限于使用
Stack

的公共接口,更适合它意味着只允许使用公共方法,因为
Stack
Stack
是不同的类型,所以不能在
Stack
的方法中调用
Stack
的非公共方法。更适合它意味着只允许使用公共方法,因为
Stack
Stack
是不同的类型,所以不能在
Stack
的方法中调用
Stack
的非公共方法。谢谢你的回答。我很困惑,因为在一本翻译的书中,它确切地说你们不能使用公共干涉,这就是为什么我如此困惑的原因。也谢谢宋元耀谢谢你的回答。我很困惑,因为在一本翻译的书中,它确切地说你们不能使用公共干涉,这就是为什么我如此困惑的原因。也感谢宋元耀