2012-07-17 66 views
3

我寫了一個函數,它查找任何給定容器中最常見的元素(請參閱下面的代碼),其中輸入是該容器的兩個const_iterator。如果我用findMostFrequent(ivec.begin(), ivec.end())來調用這個函數,其中ivecvector<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; 
} 

回答

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_type typedef/type。

+0

謝謝!我不知道iterator_traits,但我在這裏找到了一個很好的解釋:http://www.codeproject.com/Articles/36530/An-Introduction-to-Iterator-Traits – physicalattraction 2012-07-17 09:13:47

3

是,通過使函數接受Iter模板參數和使用迭代器特性(<iterator>),其推導T - 基本上週圍的其他方法。

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

在你的代碼中的迭代器類型沒有載體,因此編譯器任何關係不能推導出模板參數

相關問題