0

テンプレートベクターを作りたいのですが、イテレータを返すときに問題があります。私はすべてのインターネットを検索してきましたが、解決策は見つかりませんでした。コードは次のとおりです。

template <class Element>
class VectorDinamic {
public:
VectorDinamic();
void add(Element el);
Element get(int poz);
~VectorDinamic();
void update(Element el,int poz);
int len();

//template <class Element>
//I get errors here: missing type specifier, unexpected token precedin ";" , missing  ";" before "<"
vectorDinamicIterator<Element>* iterator();
void del(Element el);

private:
Element* elems;
int lg;
int capacitate;
void resize();
};

template <class Element>
class vectorDinamicIterator{
public:
vectorDinamicIterator(VectorDinamic* vect){
    this->curent=0;
    this->vec = vect;
}
Element element()
{
    return vec->get(this->curent);
}
void next(){
    curent++;
}
private:
int curent;
VectorDinamic* vec;

};

template <class Element>
VectorDinamic<Element>::VectorDinamic() {
capacitate = INIT_CAPACITY;
elems = new Element[capacitate];
lg = 0;
}
//I get errors down here: iterator is not a member of VectorDinamic<Element>, 
template <class Element>
vectorDinamicIterator<Element>* VectorDinamic<Element>::iterator()
{
vectorDinamicIterator iter = new vectorDinamicIterator(this);
return iter;
}

コードを短くするためにいくつかのメソッドの実装を省略しました。エラーが発生した場所にコメントを追加しましたが、その理由はわかりません。「反復子」メソッドがなくても、コードは非常にうまく機能します。

4

2 に答える 2

2

の (前方) 宣言がありませんvectorDinamicIterator。すべての名前は、使用する前に宣言する必要があります。

template < class Element >
class vectorDinamicIterator;

template <class Element>
class VectorDinamic {
public:
    VectorDinamic();
    void add(Element el);
    Element get(int poz);
    ~VectorDinamic();
    void update(Element el,int poz);
    int len();

    vectorDinamicIterator<Element>* iterator(); // <- name must be known
    void del(Element el);

private:
    Element* elems;
    int lg;
    int capacitate;
    void resize();
};

template <class Element>
class vectorDinamicIterator{
public:
    typedef VectorDynamic<Element> Vector;  //<---- specify template argument!

    vectorDinamicIterator(Vector* vect){
        this->curent=0;
        this->vec = vect;
    }
    Element element()
    {
        return vec->get(this->curent);
    }
    void next(){
        curent++;
    }
private:
    int curent;
    Vector* vec;
};

Yam Marcovic は、次の定義でテンプレート引数も指定する必要があることは正しいですVectorDinamic<Element>::iterator()

template <class Element>
VectorDinamic<Element>::VectorDinamic() {
    capacitate = INIT_CAPACITY;
    elems = new Element[capacitate];
    lg = 0;
}

template <class Element>
vectorDinamicIterator<Element>* VectorDinamic<Element>::iterator()
{
    vectorDinamicIterator<Element>* iter =
        new vectorDinamicIterator<Element>(this);
    return iter;
    // or simply
    // return new vectorDinamicIterator<Element>(this);
    // but I don't see why you return a pointer to a dynamically allocated
    // iterator, instead of just an iterator
}
于 2013-05-27T20:13:40.203 に答える
1

変数宣言とそのコンストラクターでテンプレートを指定していません。

修正するには、単にreturn new vectorDinamicIterator<Element>(this);

編集: そうそう、DyP が気づいたように、前方宣言がありません。なぜかその部分には目を向けませんでした。

于 2013-05-27T20:07:08.187 に答える