0

私は1つのクラスを持っています:

template <class EventType = SFAEvent>
class SFAEventDispatcher {
    SFALinkedList<SFACallback<EventType> > callbacks[size];

    void dispatch(EventType &e) {
        ...
        SFALinkedList<SFACallback<EventType> >::iterator iter = callbacks[e.type].begin;
        ...
    };

}

次のように定義されたイテレータで LinkedList を使用しています。

template <typename Type>
class SFALinkedList {
public: 
    typedef SFALinkedListIterator<SFASinglyElement<Type> > iterator;
}

問題は:

私が使用する場合:

SFALinkedList<SFACallback<EventType> >::iterator iter;

テンプレートで定義された EventType は機能しませんが、使用すると:

SFALinkedList<SFACallback<SFAEvent> >::iterator;

SFAEvent はクラスであり、機能します。

リンクされたリストの例:

SFALinkedList<float> list;
list.append(1.1);
list.append(2.2);
list.append(3.3);
list.append(4.4);

for(SFALinkedList<float>::iterator inter = list.begin(); inter.hasNext(); inter.next()) {
    //print inter.current(); 
}

SFAEventDispatcher クラスのテンプレートで定義された EventType を使用して、リンクされたリストのテンプレートの引数として渡すにはどうすればよいですか?

4

2 に答える 2

2

EventTypeテンプレートパラメータです。これを書くとき:

SFALinkedList<SFACallback<EventType> >::iterator iter;

コンパイラは何が何であるかを知りません::iterator:それは型ですか、それとも変数ですか? デフォルトでは、変数として解釈されます。typenameタイプを示すように指定して、それを支援する必要があります。

typename SFALinkedList<SFACallback<EventType> >::iterator iter;
//^^^^^^                                       ^^^^^^^^^^
//  |                                              |
//  +----------------------------------------------+

詳細については、この SO の質問を参照してください。

いつものように、gcc はエラー報告側の災害です...

ライブの例はこちら.

于 2013-08-03T07:54:01.610 に答える
1

EventTypeはテンプレートの正式なパラメーターであるため、このようにテンプレートをインスタンス化しても意味がありません (実際のクラスがない限りEventType)

SFALinkedList<SFACallback<EventType> >::iterator iter;

テンプレートをインスタンス化するには、実際のパラメーターを渡す必要があります。

SFALinkedList<SFACallback<SFAEvent> >::iterator iter;

また、実際のクラスEventTypeコンパイラがあれば、それを正式なパラメータとして使用することはできません。

于 2013-08-03T07:36:02.753 に答える