2

戻り値/参照に問題があります。テンプレート (キュー) を作成しています。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 の他のバリエーションにより、2 つのエラーのいずれかが返されます。私は何が欠けていますか?

#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;
}
4

2 に答える 2

0

交換

T const & temp = *front;

T& temp = front->front;

Queue<T>::frontは へのポインタです。Nodeつまり、*frontですNodeNode次に、aを aに代入しようとしていますがT& const、コンパイラは a から a に変換できないため、文句を言いますNodeTさて、 にはwhich isNodeというメンバーもあり、それがあなたが返したいものであり、修正が行うことだと思います(おそらく、あなたは に戻りたいと思っているでしょう。あなたの意図は私にはわかりません。)frontTfront->node

また、 as を宣言tempT const &Front返します。ただし、によって返される型FrontT&(non ) であり、コンパイラはから non-nonstに変換できません。(修正のように) non-を宣言することにより、そのような変換は不要になります。constconsttempconst

于 2013-03-23T10:03:13.423 に答える
0

あなたのNodeクラス定義はあまり意味がありません: 現在の方法では、各ノードは 3 つのデータ値を格納します:frontと. クラスはトリプルのキューであるはずですか?backnode

それにもかかわらず、関数では、ノード自体ではなく、Front()フロント ノードの「ペイロード」を返す (つまり、 type の何かを返す) 必要があります。Tこのようなもの:

T& Front()
{
    if (Empty())
        cout << "Очередь пуста." << endl;
    else
    {
        return front->node;
    }
}
于 2013-03-23T09:43:48.523 に答える