template<class A,class B>
void tmp(){
set<int,int>::iterator it; //works
set<A,B>::iterator it; // doesn't work
}
答案 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
解释为类型还是变量/函数; 之前模板实例化。但是,在模板实例化之前,不可能进行该确定,因为在一般情况下,这可能取决于A
和B
的值。因此,除非另有明确说明,否则编译器将其视为变量/函数。这会导致解析错误。