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

C++ 错误C2027:使用未定义的类型-如何声明类,c++,class,syntax,forward-declaration,C++,Class,Syntax,Forward Declaration,我遇到了以下错误——我只是先提供类的定义,然后再声明它。我的理解是,只要我们这样做,就像我在函数定义方面做了无数次一样,编译器就会得到它,但我的理解似乎有缺陷。有人能帮助我理解在理解如何声明类时缺少的部分吗 error C2027: use of undefined type 'generic_iterator' note: see declaration of 'generic_iterator 不工作-上面显示的错误 #include <iostream> class ge

我遇到了以下错误——我只是先提供类的定义,然后再声明它。我的理解是,只要我们这样做,就像我在函数定义方面做了无数次一样,编译器就会得到它,但我的理解似乎有缺陷。有人能帮助我理解在理解如何声明类时缺少的部分吗

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

编译器需要知道类
泛型迭代器
在解析这些函数定义时的定义

iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }
否则,无法判断此代码是否正确,也就是说类
generic\u iterator
是否有一个可以用一个参数调用的构造函数

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

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

还可以尝试将限定符
const
与不会更改对象本身的成员函数一起使用,例如
empty
max_size
print

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

当您在使用前声明某项内容的摘要时,这称为前向声明

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

但是,在向类进行前向声明时,编译器只知道这个特定符号(
generic\u iterator
)是一个类。随后,在完全定义它之前,您可以对它执行的唯一操作是声明指向它的指针。(和C++相比,更多的人知道一个或两个额外的神秘用法。)你不能调用它的任何成员,因为编译器还不知道它的结构。您的代码正试图调用前向引用类的构造函数,但编译器还不知道有这样的构造函数

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


这将被编译,因为在那一刻,
generic\u iterator
的完整类定义是已知的。

感谢关于类的其他函数的指针-所以我展示的工作方式是,这是声明类的唯一方式吗,也就是说,在其他类中使用它之前,先完全定义它-或者我需要记住其他形式的前向声明吗?@ifelse您可以在类定义之外定义这些函数(它们将仅在类定义中声明)在迭代器的类定义之后。谢谢你的回答并更正了我的行话-所以只有工作方法才能绕过错误-或者在这种情况下还有其他方法来声明前向声明吗?@If else我修改了我的答案。啊哈!!!我现在得到了它,通常我在.cpp中声明,这次我在内联中声明了它,我遇到了错误。我想现在我在它下面好多了…非常感谢!!
int& operator [](int i);
int operator [](int i) const;
bool empty() const;
void print() const;
size_t max_size()const;