2009-11-26 53 views
1

我有一個非常愚蠢的問題,下面顯示的代碼。 目標是一次增加多個計數器,並在提供的函子處理後打印其值。如何獲取模板對象矢量上的迭代器?

不過G ++抱怨:

test.hpp:32: error: expected `;' before 'it' "

我嘗試添加一些類型定義,但仍顯示錯誤信息。下面是代碼(簡化更大的一串代碼的版本)

#include <vector> 
#include <iostream> 

template <class F> 
class Counter 
{ 
    public: 
    Counter(); 
    void increment(int amount); 
    private: 
    F calc; 
    int current_amount; 
}; 

template <class F> 
void Counter<F>::increment(int amount) 
{ 
    current_amount += amount; 
    std::cout << F(amount) << "\n"; 
} 

template <class F> 
class CounterBattery 
{ 
    public: 
     CounterBattery(); 
     void incrementAll(int amount); 
    private: 
     std::vector<Counter<F> > counters; 
}; 

template <class F> 
void CounterBattery<F>::incrementAll(int amount) 
{ 
    for (std::vector<Counter<F> >::iterator it = counters.begin() ; it != counters.end() ; it++) // fails to compile here 
    it->increment(amount); 
} 

我不明白我在做什麼錯在這裏的模板。

感謝所有幫助您可以提供

+0

學會使用#1的標記。縮進4個空格的代碼,它會自動爲您添加顏色。 – 2009-11-26 18:22:53

回答

1

我認爲這可能與std::vector<Counter<F> >::iterator是一個從屬名稱,嘗試用
typename std::vector<Counter<F> >::iterator來代替它有關。
這樣編譯器會忽略它,直到它實際上是用實例給定F.

下面的鏈接模板dependent names in C++

編輯:以下jalf回答這個link解釋說,如果我們指定類型名的編譯器不會將名稱與變量混淆,這就是爲什麼它會被推遲的原因,如果沒有消除歧義,它會認爲它是一個變種,並嘗試在那個時候解決它。

+0

正確的解決方案,但你的解釋是錯誤的。當模板被實例化時,'typename'不會影響*。它只是告訴編譯器假定'iterator'是一個類型,而不是一個值。 – jalf 2009-11-26 15:53:38

+0

我沒有說它會影響到模板實例化,我說它會推遲類型識別,直到模板被實例化,我相信這在技術上是正確的。 – 2009-11-26 15:55:18

+0

感謝您的回答,它完美運作。並感謝您的鏈接! – tiredOfCpp 2009-11-26 16:20:09

5

插入類型名稱的位置:

for (typename std::vector<Counter<F> >::iterator it = counters.begin() ;