声明一个C ++设置迭代[重复](declaring a C++ set iterator [dup

2019-06-26 00:06发布

可能重复:
在哪里,为什么我必须把“模板”和“类型名称”关键字?
C ++模板类型名称迭代器

下面的代码不会编译:

#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;
}

我得到一个错误说:

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 ++给了我这个可怕的消息。

如果它是有帮助的,它看起来像,如果我注释掉符合迭代器,没有错误。 不过,我在网上看到的所有例子到目前为止似乎声明迭代器这种方式。 我认为。

Answer 1:

您之前用声明关键字typename ,正是如此:

typename set<T>::iterator it;

你需要做这个,只要你是指一个类型,它是依赖于一个模板参数。 在这种情况下, iterator依赖于T.否则,编译器有困难试图找出什么iterator是,它是否是一个类型,或一个静态成员或别的东西。 (当然,从技术上讲,它并没有试图搞清楚,它的决定已经做出,这恰好是错误的)

需要注意的是,如果你有一个具体的类型,例如:

set<int>::iterator it;

typename是没有必要的。



文章来源: declaring a C++ set iterator [duplicate]