2011-11-13 10 views
1

私はテンプレートを使用してC++標準ライブラリのベクトルクラスをカプセル化しようとしているが、私はエラーを得続けるがC++テンプレートラッパークラス::ベクトル

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

もう1つ...あなたは '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) 

Vector :: iteratorはコンパイル時の定数である可能性があり、コンパイラはインスタンス化時までそれを知ることができません。だから明白にそれを伝えなければならないのです。

+0

あなたは正しいですか?ところで、私がここで達成しようとしているのは、私に挿入配列マップを持たせるデータ構造です。私は挿入順序を維持するためのベクトルとキーと値の関係を維持するためのマップを使用します。 正しい軌道にいるのですか? –

+1

@ JorgeSilva:あなたはBoost.MultiIndexを使うことができます。 – thiton

+0

私はできません。それは学者のプロジェクトであり、ブーストは許可されていません。 –

3

あなたは、プレーン

std::vector<V>::iterator 

を持っていた場合、依存名で、あなたはイテレータの型であることを示すためにtypenameが必要であるとことはかなり明らかであろう。

typedefを使用してもそれは実際には変更されません。