ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 错误C2027:使用未定义类型 – 如何声明类

2019-08-24 11:07:45  阅读:1378  来源: 互联网

标签: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;
};

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

解决方法:

在使用之前声明某事物的摘要时,这称为前向声明.

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

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

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

这将编译,因为在那一刻,generic_iterator的完整类定义是已知的.

标签:c,class,syntax,forward-declaration
来源: https://codeday.me/bug/20190824/1707199.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有