关于模板:声明C++集合迭代器

declaring a C++ set iterator

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Where and why do I have to put the “template” and “typename” keywords?
c++ template typename iterator

以下代码将无法编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <set>
using namespace std;

template<class T>
void printSet(set<T> s){
    set<T>::iterator it;
}

int main(int argc, char** argv){
    set<int> s;
    printSet<int>(s);
    return 0;
}

我得到一个错误说:

1
2
3
4
5
6
set.cpp: In function ‘void printSet(std::set<T, std::less<_Key>, std::allocator<_CharT> >):
set.cpp:7: error: expected `;' before ‘it’
set.cpp: In function ‘void printSet(std::set<T, std::less<_Key>, std::allocator<_CharT> >) [with T = int]’:
set.cpp:12:   instantiated from here
set.cpp:7: error: dependent-name ‘std::set<T,std::less<_Key>,std::allocator<_CharT> >::iterator’ is parsed as a non-type, but instantiation yields a type
set.cpp:7: note: say ‘typename std::set<T,std::less<_Key>,std::allocator<_CharT> >::iterator’ if a type is meant

我做错了什么?我觉得我几乎没有写任何东西,而且C++已经给了我这个可怕的信息。

如果它是有用的,那么看起来,如果我用迭代器注释掉这一行,就没有错误。但是,到目前为止我在网上看到的所有示例似乎都是这样声明迭代器的。我想。


在你的声明前面加上关键词typename,周四:

1
typename set<T>::iterator it;

每当引用依赖于模板参数的类型时,都需要这样做。在这种情况下,iterator依赖于t。否则,编译器很难找出iterator是什么,它是一种类型,还是静态成员或其他类型。(好吧,从技术上讲,它并不想搞清楚,它的决定已经做出了,只是碰巧是错误的)

请注意,如果您有具体类型,例如:

1
set<int>::iterator it;

不需要typename