1

これが私が書こうとしているテンプレート(キュー)です:

#include <iostream>

using namespace std;

template <typename T>
class Queue
{
    friend ostream& operator<< (ostream &, const Queue<T> & );
private:
    template<class> class Node;
    Node<T> *front;
    Node<T> *back;
public:
    Queue() : front(0), back(0) {}
    ~Queue();
    bool Empty()
    {
        return front == 0;
    }
    void Push(const T& NewEl)
    {
        Node<T&> *El = new Node<T> (NewEl);
        if (Empty())
            front=back=El;
        else
        {
            back-> next = El;
            back = El;
        }
    }
    void Pop()
    {
        if (Empty())
            cout << "Очередь пуста." << endl;
        else
        {
            Node<T> *El = front;
            front = front -> next;
            delete El;
        }
    }
    void Clear()
    {
        while (! Empty())
            Pop();
    }
};

template <typename T>
class Node
{
    friend class Queue<T>;
public:
    Node() {next = 0;}
    Node(T nd) {nd=node; next=0;}
    T& getsetnode(){return node;}
    Node<T>*& getsetnext(){return next;}
private:
    T front;
    T back;
    T node;
    Node<T> *next;
};

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();
    queueInt->Back();
    queueInt->Clear();
    cout << "Clear" << endl;
    return 0;
}

これらの行で:

    Node<T&> *El = new Node<T> (NewEl);

    front = front -> next;
    delete El;

私は得るImplicit instantiation of undefined template 'Queue<int>::Node<int>'。私は何を間違っていますか?この投稿を読んだ後、それが問題であるかどうかを確認するために に変更しようとしましたが、同じエラーが発生するため、そうではないようintです。const int

LLVM コンパイラ 4.2 で XCode を使用しています。GCC に切り替えると、さらにエラーが発生します。

template<class> class Node;gets Declaration of 'struct Queue<int>::Node<int>'Node<T&> *El = new Node<T> (NewEl);gets Invalid use of incomplete type、および El への代入を扱うものは変換できません(ただし、参照<int&>*<int>*削除しても LLVM の場合は何も変更されません)。

4

1 に答える 1

4
template <typename T>
class Queue
{
private:
    template<class> class Node;
/* ... */

これは の前方宣言ですQueue::Node。後者の定義class Nodeはグローバル名前空間にあるため、同じではなく、 を使用Queue::Nodeすると不完全型エラーが発生します。とにかく内部ノードへのインターフェースを提供しないので、のグローバル定義を破棄して、Nodeそれを貼り付けますQueue

template <typename T>
class Queue
{
private:
    class Node
    {
    public:
    Node() {next = 0;}
    /* ... */
     };
/* ... */
};
于 2013-03-23T05:13:35.530 に答える