• [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的内部状况。所以不能直接声明本体,只能声明指针。

  • 相关阅读:
    04_远程管理常用命令
    03_文件和目录常用命令
    02_Linux 终端命令格式
    01_常用 Linux 命令的基本使用
    test
    centOS 7 更改root密码
    安装 centos7
    1
    IO模型
    使用git连接到Github
  • 原文地址:https://www.cnblogs.com/cjdty/p/14638288.html
Copyright © 2020-2023  润新知