3

CList と呼ばれる循環リスト用のカスタム クラスを作成しています。私はかなり前に完了した宿題に基づいて、たくさんのコピペをしたので、私が作品を書いてきたすべてを正確に覚えているわけではありません.

とにかく、単に .h ファイルをインクルードしようとすると、using namespace std 行でエラーが発生します。

main.cpp:11: error: expected unqualified-id before ';' token

私のコード内の関数を指している2つのエラーと同様に:

In file included from main.cpp:9:
CList.h:119: error: non-template 'CIterator' used as template
CList.h:119: note: use 'CList<T>::template CIterator' to indicate that it is a template

これは問題の機能です:

template <class T> 
typename CList<T>::CIterator<T> CList<T>::push(T const& v) 
{
    size++;  
    Node<T>* p = new Node<T>(v);

    if (this -> size_ == 1)
    {
        head = p;
        tail = p;
        p -> next = p;
        p -> prev = p;
    }
    else
    {
        tail -> next = p;
        p -> next = head;
        p -> prev = tail;
        head -> prev = p;
        tail = p;
    }

    return CIterator(p);
}

ここでのエラーの意味がよくわかりません。関数に CList の CIterator を返すように指示しており、この関数が CList クラスの一部であることを示しています。行を読むとそれがわかる

typename CList<T>::CIterator<T> CList<T>::push(T const& v) 

明らかに T がテンプレートであるのに、なぜ CIterator がテンプレートであると考えるのですか? 私はただ混乱しています。

4

1 に答える 1

1

エラー メッセージにはCIterator<T>、テンプレートとは見なされないことが示されています。これは、それが依存名であり、コンパイラーが実際にネストされたテンプレートであることをインスタンス化時にのみ実際に判断できるためです。この問題を解決するには、実際にはテンプレートであることをコンパイラに伝えます。

template <class T> 
typename CList<T>::template CIterator<T> CList<T>::push(T const& v) 
{
    ...
}

がテンプレートであるかどうかをコンパイラが判断できない理由はCList<T>::CIterator<T>、クラスCList<X>が一部の型に特化しXて、ネストされたテンプレートを内部に持たないようにすることができるためです。ただし、コンパイラは、テンプレートがインスタンス化されたときにのみ、これらの特殊化について認識します。

于 2013-08-26T03:11:02.063 に答える