【发布时间】:2016-04-21 06:18:29
【问题描述】:
作为本书中的一个例子: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() 成员函数?这不是公共方法吗?
【问题讨论】:
-
表示只允许使用公共方法,因为
Stack<T>和Stack<T2>是不同的类型,所以不能在Stack<T>的方法中调用Stack<T2>的非公共方法。
标签: c++ templates operator-keyword assign