我遇到了二叉树的问题:
....
template
class BinaryTree
{
private:
template
struct Node
{
T value;
Node* left;
Node* right;
};
private:
Node* root;
std::stack<Node<T>const *> stack;
stack.push(root);
while(false == stack.empty())
{
Node<T>* node = stack.pop();
this->visited(node->value);
std::stack<Node<T>const *> stack;
stack.push(root);
while(false == stack.empty())
{
Node<T>* node = stack.pop();
this->visited(node->value);
之后,当我尝试实施第一次呼吸时:
模板
class BinaryTree
{
私人的:
模板
struct Node
{
T值;
节点*离开;
节点*权利;
};
私人的:
节点* root;
我收到了错误消息:
错误4错误C2440:'初始化':无法从'void'转换为'BinaryTree :: Node *'c:\ users \ stephan \ documents \ visual studio 2012 \ projects \ graphs \ binarytree \ binarytree.cpp 152 1二叉树
答案 0 :(得分:5)
问题在于:
Node<T>* node = stack.pop();
Node<T>* node = stack.top();
stack.pop();
原始STL documentation解释了此设计背后的原因:
有人可能想知道为什么pop()返回void而不是value_type。也就是说,为什么必须使用top()和pop()来检查和删除顶部元素,而不是将两者组合在一个成员函数中?事实上,这种设计有充分的理由。如果pop()返回顶部元素,则必须按值而不是按引用返回:按引用返回将创建一个悬空指针。然而,按值返回是低效的:它涉及至少一个冗余复制构造函数调用。由于pop()不可能以高效和正确的方式返回值,因此更不明智地返回任何值并要求客户端使用top()来检查值堆栈的顶部。