基于模板的容器的迭代器

时间:2011-02-07 17:09:34

标签: c++

template<class A,class B>
void tmp(){
    set<int,int>::iterator it; //works
    set<A,B>::iterator it; // doesn't work
}

1 个答案:

答案 0 :(得分:6)

由于C ++语法中的一些相当恼人的限制,您必须使用set<A,B>::iterator关键字明确告诉C ++ typename是类型名称,而不是静态成员标识符。例如,这段代码编译得很好:

#include <set>

template<class A, class B>
void tmp() {
    std::set<int,int>::iterator x; // OK
    typename std::set<A,B>::iterator it; // Also OK
}

int main() {
    tmp<int,int>();
    return 0;
}

这是因为C ++要求编译器在解析语法时最终决定是将set<A,B>::iterator解释为类型还是变量/函数; 之前模板实例化。但是,在模板实例化之前,不可能进行该确定,因为在一般情况下,这可能取决于AB的值。因此,除非另有明确说明,否则编译器将其视为变量/函数。这会导致解析错误。