2011-11-13 97 views
1

我試圖使用模板來封裝C++標準庫的向量類,但我不斷收到錯誤C++模板包裝類的std :: vector的

SceneVector.h: In member function ‘void scenegraph::SceneVector<V>::print()’: 
SceneVector.h:40: error: expected ‘;’ before ‘it’ 
SceneVector.h:40: error: ‘it’ was not declared in this scope 

我已經成功地創建的代碼是

#include <map> 
#include <vector> 
#include <iostream> 

namespace scenegraph 
{ 
    template <class V> class SceneVector 
    { 
     typedef std::vector<V> Vector; 
     Vector vector; 

     public: 
      SceneVector(); 
      void insert(const V value); 
      void print(); 
    }; 

    template <class V> SceneVector<V>::SceneVector() 
    { 
     vector.clear(); 
    } 

    template <class V> void SceneVector<V>::insert(const V value) 
    { 
     vector.push_back(value); 
    } 

     template <class V> void SceneVector<V>::print() 
    { 
     for(Vector::iterator it = vector.begin(); it != vector.end(); ++it) 
     { 
      std::cout << "[" << (*it) << "] " << std::endl; 
     } 
     std::cout << std::endl; 
    } 
} 

任何人都可以在這裏糾正我嗎?我必須強化我是C++新手,所以答案可能非常微不足道。

+2

另一個......你需要'typename'。 http://stackoverflow.com/q/1123080/51831 – jpalecek

+1

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.21 – ephemient

回答

3

訪問依賴於模板參數的類型時,必須預先加上typename以使分析器清楚該類型是否爲類型。

for(typename Vector::iterator it = vector.begin(); it != vector.end(); ++it) 

這是可能的矢量::迭代器是一個編譯時間常數,編譯器無法知道,直到實例化時。這就是爲什麼你必須明確地告訴它。

+0

你是對的。順便說一下,我試圖在這裏實現的是一個數據結構,它允許我有一個插入有序地圖。我使用一個矢量來維護插入順序和一個映射來維護鍵值關係。 我在正確的軌道上嗎? –

+1

@JorgeSilva:你可以使用Boost.MultiIndex。 – thiton

+0

我不能。這是一個學者項目,不允許使用Boost ... –

3

如果你有一個普通的

std::vector<V>::iterator 

這將是非常明顯的,它依賴的名字,那你需要一個typename,表明迭代器是一種類型。

使用typedef並沒有真正改變這一點。

相關問題