0

我有一堂课:

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是模板的形式参数,因此当您像这样实例化模板时没有任何意义(只要没有实际的 class EventType

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

您应该传递一个实际参数来实例化模板,例如,

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

另外,我相信如果您有一个实际的类EventType编译器,则不允许将其用作形式参数。

于 2013-08-03T07:36:02.753 回答