zoukankan      html  css  js  c++  java
  • [C++] does not name a type

    从网上找到了以下几点 https://blog.csdn.net/fly20180712/article/details/88306008

    1、没有加调用函数的头文件
    2、不存在xxx命名空间
    3、包含头文件,但是调用的时候,类名写错了

    但是我睁大了眼睛也没看到错误在哪里,直到后来注意到我似乎出现了循环定义。

    有两个文件,一个类 一个结构体结构如下

    log.h

    #include "Squeue.h"
    
    struct event_info{
        int fd;
        Squeue q;
    };
    

    Squeue.h

    ...
    #include "log.h"
    
    class Squeue{
        event_info* ei;
    public:
        int push(char* src,int len){
            ...
            ei->q->push(...);
            ...
        }
    };
    ...
    

    上面出现的问题就是,event_info结构体中用到了Squeue类,但是同时Squeue也用到了event_info结构体

    这样就会出现环形定义的情况,会出现does not name a type的错误。

    但是根据提示根本不知道问题是什么,直到我注意到了环形定义。然后在结构体定义的上面写上了class Squeue; 向前声明。然后错误变化了,变成了"field has incomplete type"

    通过查询这个错误,找到了这个博客

    https://blog.csdn.net/smcnjyddx0623/article/details/51736195

    找到了解决方法,就是把上面结构体中的 Squeue q;改成 Squeue *q; 当然,还需要修改对应的代码,把 q.push()修改成q->push()

    原因是因为在定义结构体event_info的时候,还没有编译到Squeue,此时编译器还不知道Squeue的内部状况。所以不能直接声明本体,只能声明指针。

  • 相关阅读:
    LeetCode(122. 买卖股票的最佳时机 II)
    LeetCode(485. 最大连续1的个数)

    约瑟夫问题
    链表
    队列
    稀疏数组
    乐优商城项目学习
    LeetCode_Climbing Stairs
    数据结构&&算法基础知识
  • 原文地址:https://www.cnblogs.com/cjdty/p/14638288.html
Copyright © 2011-2022 走看看