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++已经给了我这个可怕的信息。
如果它是有用的,那么看起来,如果我用迭代器注释掉这一行,就没有错误。但是,到目前为止我在网上看到的所有示例似乎都是这样声明迭代器的。我想。
在你的声明前面加上关键词
1 | typename set<T>::iterator it; |
每当引用依赖于模板参数的类型时,都需要这样做。在这种情况下,
请注意,如果您有具体类型,例如:
1 | set<int>::iterator it; |
不需要