类型和从属名称

Type and Dependent Name

本文关键字:类型      更新时间:2023-10-16

手动创建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

并且该代码不编译。但如果我主要调用这样的函数:

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

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

下面的链接有一个解决方案和答案,

"从属名称不是类型";,但是在前面加上";typename";导致编译器崩溃

简而言之,"std::vector::迭代器"是一个依赖名称,而不是类型名称。因此,您不能直接用作类型名称。您必须指定"typename std::vector::迭代器"。

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

typename std::vector<T>::iterator

您可以参考以下内容:http://pages.cs.wisc.edu/~driscoll/typename.html

提供的答案都不能真正解释为什么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::value_type"之前缺少"typename"。如果我将签名更改为以下来源:

vector<typename C::iterator> find_all(C& c, typename C::value_type v) {

它编译起来没有问题。如果编译器能够计算出C&c、 为什么它不能算出c::value_type?