错误C2027:使用未定义的类型 - 如何声明类

时间:2015-11-27 21:29:06

标签: c++ class syntax forward-declaration

我遇到了以下错误 - 当我首先提供类的定义然后稍后声明它。我的理解是,只要我们这样做,因为我已经多次进行函数定义,编译器得到它但似乎我的理解是有缺陷的,有人可以帮助我理解在理解如何声明类时缺少的部分。

error C2027: use of undefined type 'generic_iterator'
note: see declaration of 'generic_iterator  

不起作用 - 上面显示的错误

#include <iostream>
class generic_iterator;
class darray
{
public:
    typedef generic_iterator iterator;
    darray();
    darray(int size);
    ~darray();
    int& at(int index);
    int& operator [](int i);
    int* data(void);
    bool empty();
    void fill(int val);
    void print();
    size_t max_size();
    iterator begin() {return iterator(ptrarray); }
    iterator end() { return iterator(ptrarray + size); }

private:
    int *ptrarray;
    int num_elements;
    int size;
};

class generic_iterator
{
public:
    generic_iterator(int *ptr);
    ~generic_iterator();
    generic_iterator& operator++();     // pre-increment
    generic_iterator operator++(int);    // post-increment
private:
    int *iptr;
};

作品:首先声明整个班级

class generic_iterator
{
public:
    generic_iterator(int *ptr);
    ~generic_iterator();
    generic_iterator& operator++();     // pre-increment
    generic_iterator operator++(int);    // post-increment
private:
    int *iptr;
};

class darray
{
public:
    typedef generic_iterator iterator;
    darray();
    darray(int size);
    ~darray();
    int& at(int index);
    int& operator [](int i);
    int* data(void);
    bool empty();
    void fill(int val);
    void print();
    size_t max_size();
    iterator begin() {return iterator(ptrarray); }
    iterator end() { return iterator(ptrarray + size); }

private:
    int *ptrarray;
    int num_elements;
    int size;
};

2 个答案:

答案 0 :(得分:3)

编译器需要知道类generic_iterator的定义,因为它正在解析这些函数定义

iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }

否则无法说明此代码是否正确,即类generic_iterator是否具有可以使用一个参数调用的构造函数。

考虑到声明一个常量下标运算符和非常量运算符是正确的。例如

int& operator [](int i);
const int& operator [](int i) const;

int& operator [](int i);
int operator [](int i) const;

同时尝试将限定符const与不改变对象本身的成员函数一起使用,例如emptymax_sizeprint

bool empty() const;
void print() const;
size_t max_size()const;

答案 1 :(得分:3)

在使用之前声明某些内容摘要时,这称为前向声明

在对函数进行前向声明时,编译器具有解析调用该函数的代码所需的一切:函数的名称,返回的类型,参数的数量以及每个参数的类型。

但是当向类生成前向声明时,编译器只知道此特定符号(在您的情况下为generic_iterator)是一个类。随后,在完全定义它之前,你唯一可以做的就是声明一个指向它的指针。 (而且比我更熟悉C ++的人可能会知道一两个额外的奥术用法。)你不能调用它的任何成员,因为编译器还不知道它的结构。您的代码正在尝试调用前向引用类的构造函数,但编译器还不知道任何此类构造函数。

我不知道有什么简单的方法可以解决这个问题。其他人可能有更好的解决方案,但我倾向于解决此问题的方法是将需要访问前向声明的类的成员的所有代码从.h文件移动到.cpp文件。因此,在您的情况下,在.h文件中,我只需编写iterator begin();,然后在.cpp文件中写入generic_iterator darray::begin() {return iterator(ptrarray); }

这会编译,因为那时generic_iterator的完整类定义是已知的。