我遇到了返回值/引用的问题。我正在编写模板(队列),Front()
函数应该从队列的前面返回元素,但是我收到错误 - No viable conversion from 'Queue<int>::Node' to 'const int'
。当我删除const
时,我得到Non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'Queue<int>::Node'
,而其他引用/无引用的变体,const / no const给出了两个错误中的任何一个。我错过了什么?
#include <iostream>
using namespace std;
template <typename T>
class Queue
{
friend ostream& operator<< (ostream &, const Queue<T> & );
private:
class Node
{
friend class Queue<T>;
public:
Node(const T &t): node(t) {next = 0;}
private:
T front;
T back;
T node;
Node *next;
};
Node *front;
Node *back;
public:
Queue() : front(0), back(0) {}
~Queue();
bool Empty()
{
return front == 0;
}
T& Front()
{
if (Empty())
cout << "Очередь пуста." << endl;
else
{
T const & temp = *front; // error here
return temp;
}
}
/* ... */
};
template <class T> ostream& operator<< (ostream &, const Queue<T> & );
int main()
{
Queue<int> *queueInt = new Queue<int>;
for (int i = 0; i<10; i++)
{
queueInt->Push(i);
cout << "Pushed " << i << endl;
}
if (!queueInt->Empty())
{
queueInt->Pop();
cout << "Pop" << endl;
}
queueInt->Front();
return 0;
}
答案 0 :(得分:0)
您的Node
类定义没有多大意义:现在的方式,每个节点存储3个数据值:front
,back
和node
。这个班级应该是三元组吗?
然而,在你的Front()
函数中,你需要返回前节点的“有效载荷”(即返回T
类型的东西),而不是节点本身。像这样:
T& Front()
{
if (Empty())
cout << "Очередь пуста." << endl;
else
{
return front->node;
}
}
答案 1 :(得分:0)
替换
T const & temp = *front;
与
T& temp = front->front;
Queue<T>::front
是指向Node
的指针,换句话说,*front
是Node
。您正在尝试将Node
分配给T& const
,并且由于编译器无法从Node
转换为T
,因此会抱怨。现在,Node
还有一个名为front
的成员T
,我假设这就是您想要返回的内容,而这就是修复的作用。 (可能你想要归还front->node
。你的意图对我来说并不清楚。)
此外,您将temp
声明为T const &
,Front
将其返回。但是,Front
返回的类型为T&
(非nonst
),编译器无法从const
转换为非const
。通过声明temp
非const
(如修复中所示),不再需要此类转化。