C++模板完整指南.分配运算符
C++ Templates the complete guide. Assign operator
作为本书中的一个例子: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 != T2
,Stack<T>
和Stack<T2>
是不相关的类型,所以Stack<T>
方法不能使用Stack<T2>
的私有成员(除非声明为 friend
(。
Stack<T>
(与任何其他类一样(仅限于使用 Stack<T2>
的公共接口。
但是,此堆栈具有不同的类型(如果实例化两种不同类型的类模板,则会获得两种不同的类型(,因此只能使用公共接口。
这意味着您应该只使用公共接口。事实上,如果你想实现 operator= 函数,那么你必须只使用公共接口。
如果您不使用公共接口,您将无法访问 top(( 函数,这是将堆栈的元素分配给另一个堆栈的唯一方法。
是的,top(( 是一个公共函数。
- 正在尝试重载二进制搜索树分配运算符
- 自定义先决条件对移动分配运算符有效吗
- C++ - 没有自定义交换功能的移动分配运算符?
- 强制复制分配超过移动分配运算符
- 在之后仍需要使用源对象时调用父移动分配运算符
- c++ 使用动态分配运算符反向数组元素
- 当存在用户定义的移动分配运算符时,已删除模板移动分配运算符
- C++ - 从移动分配运算符调用复制分配
- 不工作 复制分配运算符
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 返回对象如何与分配运算符一起工作
- 下标是否在分配运算符的右侧进行评估
- C++分配适用于已删除的分配运算符
- 用于删除复制/移动分配运算符的有效签名
- 使用新放置作为复制分配运算符不好吗?
- C++ - 父级中的 CRTP 分配运算符不起作用
- 复制派生类的分配运算符
- 未定义 Lambda 复制分配运算符
- 为什么标准在移动分配运算符中使用交换?
- 正确编写复制构造函数和分配运算符的方法