错误 C2027:使用未定义的类型 - 如何声明 class
error C2027: use of undefined type - how to declare class
我 运行 陷入以下错误 - 当我只是先提供 class 的定义然后再声明它时。我的理解是只要我们这样做,因为我已经为函数定义做了很多次,编译器就明白了,但似乎我的理解是有缺陷的,有人可以帮助我理解在理解如何声明 class 时缺少的部分吗?
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 时
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;
};
编译器在解析这些函数定义时需要知道 class generic_iterator
的定义
iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }
否则无法判断这段代码是否正确,就是class 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;
当你在使用某物之前声明它的摘要时,这被称为前向声明。
当对函数进行前向声明时,编译器拥有解析调用该函数的代码所需的一切:函数的名称、返回的类型、参数的数量以及每个参数的类型参数。
但是当对 class 进行前向声明时,编译器只知道这个特定符号(在您的例子中是 generic_iterator
)是 class。随后,在它被完全定义之前你唯一能做的就是声明一个指向它的指针。 (比我更了解 C++ 的人可能知道一两个额外的神秘用法。)您不能调用它的任何成员,因为编译器还不知道它的结构。您的代码试图调用前向引用 class 的构造函数,但编译器还不知道任何此类构造函数。
我不知道有什么简单的方法可以解决这个问题。其他人可能有一些更好的解决方案,但我倾向于解决此问题的方法是将所有需要访问前向声明的 class 成员的代码从 .h
文件移动到 .cpp
文件。因此,在您的情况下,在 .h
文件中我会简单地写 iterator begin();
,然后在 .cpp
文件中我会写 generic_iterator darray::begin() {return iterator(ptrarray); }
。
这会编译,因为在那一刻 generic_iterator
的完整 class 定义是已知的。
我 运行 陷入以下错误 - 当我只是先提供 class 的定义然后再声明它时。我的理解是只要我们这样做,因为我已经为函数定义做了很多次,编译器就明白了,但似乎我的理解是有缺陷的,有人可以帮助我理解在理解如何声明 class 时缺少的部分吗?
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 时
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;
};
编译器在解析这些函数定义时需要知道 class generic_iterator
的定义
iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }
否则无法判断这段代码是否正确,就是class 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;
当你在使用某物之前声明它的摘要时,这被称为前向声明。
当对函数进行前向声明时,编译器拥有解析调用该函数的代码所需的一切:函数的名称、返回的类型、参数的数量以及每个参数的类型参数。
但是当对 class 进行前向声明时,编译器只知道这个特定符号(在您的例子中是 generic_iterator
)是 class。随后,在它被完全定义之前你唯一能做的就是声明一个指向它的指针。 (比我更了解 C++ 的人可能知道一两个额外的神秘用法。)您不能调用它的任何成员,因为编译器还不知道它的结构。您的代码试图调用前向引用 class 的构造函数,但编译器还不知道任何此类构造函数。
我不知道有什么简单的方法可以解决这个问题。其他人可能有一些更好的解决方案,但我倾向于解决此问题的方法是将所有需要访问前向声明的 class 成员的代码从 .h
文件移动到 .cpp
文件。因此,在您的情况下,在 .h
文件中我会简单地写 iterator begin();
,然后在 .cpp
文件中我会写 generic_iterator darray::begin() {return iterator(ptrarray); }
。
这会编译,因为在那一刻 generic_iterator
的完整 class 定义是已知的。