当我只是先提供类的定义,然后再声明它时,我遇到了下面的错误。我的理解是,只要我们这么做,就像我在函数定义方面做了很多次一样,编译器就能理解它,但我的理解似乎有缺陷,有人可以帮助我理解如何声明类的理解中缺少的部分。
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;
};Works:当首先声明整个类时
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;
};发布于 2015-11-27 21:36:12
当您在使用前声明某物的摘要时,这称为前向声明。
当向函数进行前向声明时,编译器有它所需的一切来解析调用该函数的代码:函数的名称、返回的类型、参数的数量和每个参数的类型。
但是,当向类进行前向声明时,编译器只知道这个特定的符号(在您的例子中是generic_iterator)是一个类。随后,在完全定义它之前,您可以做的唯一一件事就是声明指向它的指针。(而且比我更了解C++的人可能还知道一两种神秘的用法。)您不能调用它的任何成员,因为编译器还不知道它的结构。您的代码试图调用前向引用类的构造函数,但是编译器还不知道任何这样的构造函数。
我不知道有什么容易的办法来解决这个问题。其他人可能有更好的解决方案,但我倾向于解决这个问题的方法是将所有需要访问预先声明的类成员的代码从.h文件转移到.cpp文件。因此,在您的例子中,在.h文件中,我只需编写iterator begin();,然后在.cpp文件中编写generic_iterator darray::begin() {return iterator(ptrarray); }。
这将编译,因为此时generic_iterator的完整类定义是已知的。
发布于 2015-11-27 21:34:00
编译器需要知道类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与不改变对象本身的成员函数一起使用,例如,empty或max_size,或者可能是print。
bool empty() const;
void print() const;
size_t max_size()const;https://stackoverflow.com/questions/33964994
复制相似问题