C++ 类型和从属名称

C++ 类型和从属名称,c++,templates,types,C++,Templates,Types,我可以手动创建一个std::vector::iterator对象,如: std::vector<int>::iterator i; std::vector::iterator i; 所以这里std::vector::iterator是一种类型。但当我写函数时: template <class T> std::vector<T>::iterator foo(std::vector<int>::iterator i) { return i;

我可以手动创建一个
std::vector::iterator
对象,如:

std::vector<int>::iterator i;
std::vector::iterator i;
所以这里
std::vector::iterator
是一种类型。但当我写函数时:

template <class T>
std::vector<T>::iterator foo(std::vector<int>::iterator i)
{
    return i;
}
模板
std::vector::iterator foo(std::vector::iterator i)
{
返回i;
}
编译器将显示一条警告:

std::vector<T>::iterator' : is a dependent name  not a type
std::vector::iterator':是依赖名称而不是类型
而且代码不会编译。但如果我主要是这样调用函数:

int main()
{
    vector<int> v;
    foo(v.begin());
}
intmain()
{
向量v;
foo(v.begin());
}

应解析参数
T
。那么为什么编译器会显示错误?

您必须在它前面加上Typename
std::vector::iterator
依赖于模板参数,即
T
。因此,您应该在其前面加上typename: 尝试使用:

typename std::vector<T>::iterator
typename std::vector::iterator

您可以参考以下内容:

以下链接提供了解决方案和答案


简而言之,“std::vector::iterator”是一个依赖名称,而不是类型名。因此,您不能直接将其用作类型名。您必须指定“typename std::vector::iterator”。

提供的答案都不能真正解释为什么在这种情况下需要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;
}
模板
向量查找全部(C&C,C::值类型v){
向量res;
对于(自动p=c.begin();p!=c.end();++p){
如果(*p==v)
res.push_back(p);
}
返回res;
}
当我试图编译它时,我得到消息“在依赖类型名“C::value_type”之前缺少“typename”。如果我将签名更改为以下内容,则为来源:

vector<typename C::iterator> find_all(C& c, typename C::value_type v) {
vector find_all(C&C,类型名C::value_类型v){
如果编译器能算出C&C,为什么不能算出C::value\u类型