当我尝试在模板化函数中使用迭代器时,“在 'typename' 之后需要一个限定名称”

问题描述

我想创建一个函数,它以容器 T(可以是向量、映射、列表...)作为模板,以 T 和 Int 作为参数,在这函数中,我们假设 T 是一个容器的 int,我想返回 int 在容器中的第一次出现。这是函数

template <class T> int & easyfind(T container,int n)
{
    typename T<int>::iterator it;

    for (it = container.begin(); it != container.end(); it++)
        if (*it == n)
            return (*it);
    throw (NotFoundException());
}

但是编译器说“期望在 'typename' 之后有一个限定名称”,当我用 typename 替换 class 时,编译器说“非模板类 'T' 的显式特化”,我怎样才能让它工作?

解决方法

T 是一种类型,而不是模板。你需要

typename T::iterator it;

访问其 iterator 类型成员。

你看到类似代码的原因

std::vector<int>::iterator

是因为std::vector是模板名,需要指定模板参数。在您的情况下,T 已经是模板的实例,因此无需指定参数。