如何让编译器推导出我的模板迭代器的类型?

phy*_*ion 3 c++ templates iterator typename

我写了一个函数,找到任何给定容器中最常见的元素(参见下面的代码),其中输入是该容器的两个const_iterator.如果我调用此函数,但是在findMostFrequent(ivec.begin(), ivec.end())哪里ivec是a vector<int>,则编译器无法推断出模板参数.调用函数findMostFrequent< vector<int> >(ivec.begin(), ivec.end())工作正常,但似乎很麻烦.有没有办法让编译器找出要实例化的模板?

template <typename T> typename T::value_type findMostFrequent(typename T::const_iterator beg, typename T::const_iterator end)
{
    // T is the type of container, T::value_type is the type which is stored in the container
    typename T::size_type current_streak = 0, max_streak = 0;
    T::value_type max_so_far;
    for (T::const_iterator iter = beg; iter != end; ++iter)
    {
        current_streak = count(beg, end, *iter);
        if ( current_streak > max_streak )
        {
            max_so_far = *iter;
            max_streak = current_streak;
        }
    }
    return max_so_far;
}
Run Code Online (Sandbox Code Playgroud)

ltj*_*jax 10

编译器无法推导出嵌套的说明符."找到一个具有嵌套说明符的类型,该嵌套说明符等于我看作参数的类型"太复杂,而且通常很难解决它.相反,尝试直接从迭代器中推断出您需要知道的所有内容:

template <typename IteratorType>
typename std::iterator_traits<IteratorType>::value_type
findMostFrequent(IteratorType beg, IteratorType end)
{
    typename std::iterator_traits<T>::difference_type current_streak = 0, max_streak = 0;
    typename std::iterator_traits<T>::value_type max_so_far;
    for (IteratorType  iter = beg; iter != end; ++iter)
    {
        current_streak = count(beg, end, *iter);
        if ( current_streak > max_streak )
        {
            max_so_far = *iter;
            max_streak = current_streak;
        }
    }
    return max_so_far;
}
Run Code Online (Sandbox Code Playgroud)

为什么你应该使用的原因std::iterator_traits<T>::value_type,而不是T::value_type是,它使你也有这些"迭代规范"适用于不自然定义它们的类型,如指针.例如,T*实际上是此代码段的有效迭代器,但它不包含value_typetypedef/type.