4

ポインタのベクトルを使用してデータ構造を作成していますが、不明なエラーが発生していることに気付きました。ヘッダーファイルの基本コードは次のとおりです

#include <vector>  
using namespace std;  
template <typename Key, typename Value>  
class ST{  
    class STNode{  
    public:  
        STNode(Key k, Value v) : key(k), value(v){}  
        ~STNode(){}  
        Key key;  
        Value value;  
    };  
typedef typename ST<Key, Value>::STNode Node;  
public:  
    ST():v(NULL) {v = new vector<Node*>();}  
    ~ST(){  
        // vector contains allocated objects  
        for(vector<Node*>::iterator it = v->begin(); it != v->end(); ++it)  
        delete (*it);  
        delete v;  
    }  
private:  
    vector<Node*>* v;  
};  

g++ バージョン 4.6.6 で表示されるエラー メッセージは次のとおりです。

ST.h: In destructor 'ST<Key, Value>::~ST()':  
ST.h:20: error: expected ';' before 'it'  
ST.h:20: error 'it' was not declared in this scope  

for ループを削除しようとしましたが、単純にイテレータを宣言してスコープ エラーを取得しようとしました。私の検索によると、これは通常、内部クラスの末尾にセミコロンがないか、内部クラスに公開されていないことが原因であることが示されていますが、そうではありません。ポインターのベクトルの反復子に必要な特別な宣言はありますか?

4

2 に答える 2

2

あなたは C++ 言語の興味深い癖に苦しんでいます。typenameイテレータ ( ) の宣言を追加する必要がありますtypename vector<Node*>::iterator it。詳細については、「Why do I need to use typedef typename in g++ but not VS?」という質問を参照してください。

于 2012-12-15T23:41:39.753 に答える
1

テンプレートに依存するテンプレートパラメータであるvector<Node*>::iteratorため、typedefを追加する必要があります。dependent name

for(typename vector<Node*>::iterator it = v->begin(); it != v->end(); ++it) 
于 2012-12-15T23:45:02.967 に答える