如何使用类的模板参数作为链接列表的模板参数传递?

时间:2013-08-03 07:24:01

标签: c++ templates singly-linked-list

我有一节课:

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作为链接列表的模板参数传递?

2 个答案:

答案 0 :(得分:2)

EventType是模板参数。当你这样写:

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

编译器不知道什么是::iterator:它是类型还是变量?默认情况下,它被解释为变量。您必须通过指定typename来指明类型来帮助它:

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

有关详细信息,请参阅this SO question

像往常一样,gcc在错误报告方面是一场灾难......

Live example here

答案 1 :(得分:1)

EventType是模板的形式参数,因此当您像这样实例化模板时没有任何意义(只要没有实际的类EventType

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

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

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

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