我有一节课:
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作为链接列表的模板参数传递?
答案 0 :(得分:2)
EventType
是模板参数。当你这样写:
SFALinkedList<SFACallback<EventType> >::iterator iter;
编译器不知道什么是::iterator
:它是类型还是变量?默认情况下,它被解释为变量。您必须通过指定typename
来指明类型来帮助它:
typename SFALinkedList<SFACallback<EventType> >::iterator iter;
//^^^^^^ ^^^^^^^^^^
// | |
// +----------------------------------------------+
有关详细信息,请参阅this SO question。
像往常一样,gcc在错误报告方面是一场灾难......
答案 1 :(得分:1)
EventType
是模板的形式参数,因此当您像这样实例化模板时没有任何意义(只要没有实际的类EventType
)
SFALinkedList<SFACallback<EventType> >::iterator iter;
您应该传递实际参数来实例化模板,例如
SFALinkedList<SFACallback<SFAEvent> >::iterator iter;
另外,我相信如果你有一个实际的类EventType
编译器不允许将它用作形式参数。