没有可行的从“Template <int> :: Memberclass”到“const int”</int>的转换

时间:2013-03-23 09:40:33

标签: c++ templates

我遇到了返回值/引用的问题。我正在编写模板(队列),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;
}

2 个答案:

答案 0 :(得分:0)

您的Node类定义没有多大意义:现在的方式,每个节点存储3个数据值:frontbacknode。这个班级应该是三元组吗?

然而,在你的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的指针,换句话说,*frontNode。您正在尝试将Node分配给T& const,并且由于编译器无法从Node转换为T,因此会抱怨。现在,Node还有一个名为front的成员T,我假设这就是您想要返回的内容,而这就是修复的作用。 (可能你想要归还front->node。你的意图对我来说并不清楚。)

此外,您将temp声明为T const &Front将其返回。但是,Front返回的类型为T&(非nonst),编译器无法从const转换为非const。通过声明tempconst(如修复中所示),不再需要此类转化。