【问题标题】:method returning template class C++返回模板类 C++ 的方法
【发布时间】:2013-05-27 20:00:49
【问题描述】:

我想做一个模板向量,但是当我返回迭代器时出现了问题。 我一直在搜索所有互联网,但没有找到任何解决方案。 代码如下:

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;
}

我省略了一些方法实现以保持代码简短,我在出现错误的地方添加了注释,但我不知道为什么。没有“迭代器”方法,代码运行良好。

【问题讨论】:

  • 什么错误?为什么所有这些代码?向我们展示您的testcase你可能需要typename
  • class VectorDinamic { 之前是否缺少一行 template &lt;class Element&gt;?不然怎么定义Element
  • 是的,对不起...等一下,我会编辑
  • 你真的需要返回一个动态分配的(即使用newvectorDinamicIterator吗?

标签: c++ class templates pointers


【解决方案1】:

您缺少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&lt;Element&gt;::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
}

【讨论】:

    【解决方案2】:

    您没有在变量声明及其构造函数中指定模板。

    要修复,只需return new vectorDinamicIterator&lt;Element&gt;(this);

    编辑:哦,是的,正如 DyP 注意到的那样,您缺少前向声明。由于某些原因,我没有把目光放在那部分。

    【讨论】:

    • 顺便说一句,在你的代码中,你没有按照我说的去做。现在您将指针分配给堆栈变量。如果您不想简单地立即返回它,则需要将其声明为指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多