【问题标题】:Compilation Error: void value not ignored as it ought to be in std::queue::pop() [duplicate]编译错误:void 值没有被忽略,因为它应该在 std::queue::pop() [重复]
【发布时间】:2018-01-28 14:58:58
【问题描述】:

编写一个函数,将二叉树中同一级别的所有相邻节点连接起来。给定二叉树节点的结构如下。

struct Node{
  int data;
  Node* left;
  Node* right;
  Node* nextRight; 
}

最初,所有nextRight 指针都指向垃圾值。您的函数应将这些指针设置为指向每个节点的右下角。

我的代码是

#include<queue>
/*
Please note that it's Function problem i.e.
you need to write your solution in the form of Function(s) only.
Driver Code to call/invoke your function would be added by GfG's Online Judge.*/


/* struct Node
{
  int data;
  Node *left,  *right;
  Node *nextRight;  // This has garbage value in input trees
}; */
// Should set the nextRight for all nodes
void connect(Node *p)
{
   Node *temp=p;
   queue<Node *> q;
   Node *pp=NULL;
   q.push(p);
   q.push(pp);
   while(q.empty()==false)
   {
       Node* nn=q.pop(); //  <---------- Error appears here
       Node* conn=NULL;
       if(nn!=NULL)
       {
           conn=q.front();
           nn->nextRight=conn;
           if(nn->left!=NULL)
               q.push(nn->left);
           if(nn->right!=NULL)
               q.push(nn->right);
       }
       else if(q.empty()==false)
       {
           q.push(pp);
       }

   }

}

它给出了这个错误:

Compilation Error... 
prog.cpp: In function 'void connect(Node*)':
prog.cpp:120:23: error: void value not ignored as it ought to be
        Node* nn=q.pop();
                       ^

帮助我运行代码而不出现此错误。

【问题讨论】:

  • std::queue::pop() 不返回值,在调用pop() 之前使用front() 获取它。
  • 使用front() 获取值,pop() 删除第一个不返回任何内容的元素en.cppreference.com/w/cpp/container/queue/pop
  • 请举个小例子。 / 错误信息的哪一部分你不明白?一切?您需要学习基本的 C++。
  • 什么不清楚?您正在调用一个返回 void(无)的函数,但试图将该返回值存储为 Node*。您希望它如何工作?

标签: c++ queue std


【解决方案1】:

std::queuepop 函数不会返回弹出的元素,它只会删除前面的元素,因此您必须先调用q.front(),然后再调用q.pop()

Node* nn=q.pop();

变成:

Node* nn=q.front();
q.pop();

如果你愿意,你可以写一个这样的辅助函数:

template<class T>
auto popget(T& queue)
{
    auto ret = std::move(queue.front());
    queue.pop();

    return ret;
}

然后你可以简单地这样写你的代码:

Node* nn=popget(q);

【讨论】:

  • Node* nn=q.front(); 创建前面的副本,如果是 Node*&amp; nn=q.front() 你是对的@KillzoneKid
  • 是的,对不起,你是对的
【解决方案2】:

你的错误很简单;具有弹出和推送算法的基于 STL 的容器在弹出期间不返回值。因此,您必须在容器上调用std::queue::front()(或back(),具体取决于您的需要)以在弹出之前获取值。更多详情,请阅读this question的回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2018-06-28
    • 2014-09-22
    相关资源
    最近更新 更多