3

我编写了一个函数,用于查找任何给定容器中最常见的元素(参见下面的代码),其中输入是该容器的两个 const_iterator。findMostFrequent(ivec.begin(), ivec.end())但是,如果我使用where ivecis a调用此函数vector<int>,则编译器无法推断出模板参数。用 with 调用函数可以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;
}
4

3 回答 3

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;
}

您应该使用std::iterator_traits<T>::value_type而不是的原因T::value_type是,它使您还可以为那些不能自然定义它们的类型(例如指针)提供这些“迭代器规范”。例如,T*实际上是此片段的有效迭代器,但它不包含value_typetypedef/type。

于 2012-07-17T08:34:08.677 回答
3

是的,通过使函数接受Iter模板参数并T使用迭代器特征 ( <iterator>) 从中推断 - 基本上是相反的。

于 2012-07-17T08:31:01.717 回答
2

因为作为模板参数,您必须使用迭代器类型。下面的代码运行良好

#include <iostream>
#include <vector>

template <typename IterType> 
typename IterType::value_type findMostFrequent(IterType beg, IterType end)
{
    // T is the type of container, T::value_type is the type which is stored in the container
    unsigned int current_streak = 0, max_streak = 0;
    typename IterType::value_type max_so_far;
    for (IterType 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;
}

int main()
{
    std::vector<int> v;
    for (unsigned int i = 0; i < 10; ++i)
        v.push_back(i);

    findMostFrequent(v.begin(), v.end());

    return 0;
}

在您的代码中,迭代器类型与向量没有任何关系,因此编译器无法推断出模板参数

于 2012-07-17T08:37:46.793 回答