手动我可以创建一个std::vector<int>::iterator
对象,如:
std::vector<int>::iterator i;
所以这里std::vector<int>::iterator
是一种类型。但是当我写一个函数时:
template <class T>
std::vector<T>::iterator foo(std::vector<int>::iterator i)
{
return i;
}
编译器显示警告:
std::vector<T>::iterator' : is a dependent name not a type
并且代码没有编译。但如果在main中我调用这样的函数:
int main()
{
vector<int> v;
foo(v.begin());
}
应解析参数T
。那么为什么编译器显示错误?
答案 0 :(得分:2)
您必须在其前面添加Typename
std::vector<T>::iterator
依赖于模板参数,即T
。因此,您应该使用typename作为前缀:
尝试使用:
typename std::vector<T>::iterator
答案 1 :(得分:2)
以下链接有解决方案和答案,
"Dependent Name is not a Type", but prefixing with "typename" causes compiler crash
简而言之,&#34; std :: vector :: iterator&#34;是从属名称而不是类型名称。所以你不能直接用作typename。您必须指定&#34; typename std :: vector :: iterator&#34;。
答案 2 :(得分:1)
所提供的答案都没有真正解释为什么在这种情况下需要typename。在处理以下代码时,我遇到了同样的问题:
template<typename C>
vector<typename C::iterator> find_all(C& c, C::value_type v) {
vector<typename C::iterator> res;
for (auto p = c.begin(); p != c.end(); ++p) {
if (*p == v)
res.push_back(p);
}
return res;
}
当我尝试编译时,我收到消息&#34;缺少&#39; typename&#39;在依赖类型名称之前&#39; C :: value_type&#39;&#34;。如果我将签名更改为此来源:
vector<typename C::iterator> find_all(C& c, typename C::value_type v) {
它编译没有问题。如果编译器可以找出C&amp; c,为什么它不能算出C :: value_type?