首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误C2027:使用未定义类型-如何声明类

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

Stack Overflow用户
提问于 2015-11-27 21:29:05
回答 2查看 18.4K关注 0票数 7

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

代码语言:javascript
复制
error C2027: use of undefined type 'generic_iterator'
note: see declaration of 'generic_iterator  

不工作,--上面显示的错误

代码语言:javascript
复制
#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:当首先声明整个类时

代码语言:javascript
复制
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;
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-27 21:36:12

当您在使用前声明某物的摘要时,这称为前向声明。

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

但是,当向类进行前向声明时,编译器只知道这个特定的符号(在您的例子中是generic_iterator)是一个类。随后,在完全定义它之前,您可以做的唯一一件事就是声明指向它的指针。(而且比我更了解C++的人可能还知道一两种神秘的用法。)您不能调用它的任何成员,因为编译器还不知道它的结构。您的代码试图调用前向引用类的构造函数,但是编译器还不知道任何这样的构造函数。

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

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

票数 13
EN

Stack Overflow用户

发布于 2015-11-27 21:34:00

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

代码语言:javascript
复制
iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }

否则,它将无法判断这段代码是否正确,即类generic_iterator是否有一个可以用一个参数调用的构造函数。

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

代码语言:javascript
复制
int& operator [](int i);
const int& operator [](int i) const;

代码语言:javascript
复制
int& operator [](int i);
int operator [](int i) const;

还尝试将限定符const与不改变对象本身的成员函数一起使用,例如,emptymax_size,或者可能是print

代码语言:javascript
复制
bool empty() const;
void print() const;
size_t max_size()const;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33964994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档