2011-02-07 86 views
0

我是使用模板的新手,需要使用模板來完成某些操作,但不知道如何調用模板化函數。這可能很簡單,但我看不到它。模板簽名問題

template<class It, class T> 


// iterator and value_type of *It 
void Calc(It begin, It end, std::pair<int, int> &out) 
{ 
     std::vector<It>::iterator iter; 
    std::map<int, int> StartMap; 
    std::map<int, int>::reverse_iterator rit; 

    int sum, start, stop, count; 
    start = stop = 1; 
    count = sum = 0; 

    for(iter = begin; iter != end; iter++) 
    { 
     sum += iter; 
     count++; 
     stop++; 
     if(sum <= 0) 
     { 
      // store original start 
      StartMap.insert(start, count); 
      // set new start position 
      start = stop; 
     } 
    } 

    // set iterator to highest value 
    rit = StartMap.rbegin(); 

    start = rit->first; 
    stop = start + rit->second; 

    out.insert(start, stop); 
} 

但不知道如何用2個std :: vector迭代器調用它。 我已經試過這

void doSomething(std::vector<int>& stopsVec) 
{ 
    std::pair<int, int> out; 
    Calc<std::vector<int>::iterator, std::pair<int, int>>(stopsVec.begin(), stopsVec.end(), &out); 
} 
+2

你似乎沒有使用模板參數`T`。 – Tim 2011-02-07 23:07:46

回答

4
void doSomething(std::vector<int>& stopsVec) 
{ 
    std::pair<int, int> out; 
    Calc<std::vector<int>::iterator, std::pair<int, int> > 
     (stopsVec.begin(), stopsVec.end(), out); // not &out 
} 

Calc花費std::pair<int, int>一個參考,所以你想只給它out。通過&out嘗試將指針傳遞給一對 - 這不起作用。

編輯

假設簽名居然是:

template<class It> 
void Calc(It begin, It end, std::pair<int, int> &out) 

你可以把它叫做:

Calc(stopsVec.begin(), stopsVec.end(), out); 

編譯器可以推斷出這些參數正確的模板類型,無要求你在<>之間指定它們

編輯

基思使得下面好點。這是你在這裏會遇到的另一個編譯錯誤。還請注意:

sum += iter; 

不會做你想做的。你可能是指:

sum += *iter; 

但由於sum是一個int,並iter是一個模板類型,這是不是一個真正的通用模板方法。它只能用於數字類型的迭代器。

而且,另一個問題:的

Calc<std::vector<int>::iterator, std::pair<int, int> > // use a space 
    (stopsVec.begin(), stopsVec.end(), out); 

代替

Calc<std::vector<int>::iterator, std::pair<int, int>> // ">>" is shift operator 
    (stopsVec.begin(), stopsVec.end(), out); 

您需要以具有模板語法收盤>標誌之間的空間。否則,你正在做位移(或流提取),編譯器會感到困惑,因爲從那時起沒有任何意義。

0

需要注意的是:

template<class It, class T> 
void Calc(It begin, It end, std::pair<int, int> &out) 
{ 
    std::vector<It>::iterator iter; 
    for(iter = begin; iter != end; iter++) 

是錯誤的。這也許應該是:

template<class It, class T> 
    void Calc(It begin, It end, std::pair<int, int> &out) 
    { 
     It iter; 
     // etc. 
     for(iter = begin; iter != end; iter++) 

還要注意在C++中,它通常最好是遵循「聲明是初始化」的方式,所以這成爲:

template<class It, class T> 
     void Calc(It begin, It end, std::pair<int, int> &out) 
     { 
      // etc. 
      for(It iter = begin; iter != end; iter++) 
0

你並不需要顯式傳遞正在迭代的類型作爲模板參數。 STL的設計者是相當明智的意識到,這經常出現,而且有內省的迭代器的類型,以獲得它的基本類型如下:a(不是很漂亮,但完全正確)的方式:

typedef typename std::iterator_traits<It>::value_type value_type; 

一旦你已經這樣做了,你可以使用名稱value_type來引用正在迭代的類型。這使您可以重寫模板功能

template <typename It> 
void Calc(It begin, It end, std::pair<int, int>& out) { 
    typedef typename std::iterator_traits<It>::value_type value_type; 
    /* ... Rest of the code, now using this type ... */ 
} 

而且幫你搞定,現在有不需要任何輔助類型,你可以直接調用功能

std::vector<int> v = /* ... */ 
std::pair<int, int> result; 
Calc(v.begin(), v.end(), result); 

希望這是更容易讀寫!