前置声明与C++头文件互相包含导致的error: 'xxx' does not name a type问题

2023-05-16

在一个源文件中,要声明或定义一个类的指针时,必须在使用前声明或定义该类,因此下面的代码会报错:

class A
{
public:
    B *b;
};

class B
{
public:
    A *a;
};

int main()
{
    return 0;
}

报错为“error: ‘B’ does not name a type”,就是因为在A类中使用B *b之前没有声明或定义B类,如果在第一行加上一句前置声明(forward declaration)“class B;”,就不会有这样的问题了。
而在头文件互相包含时,也会引发“error: ‘xxx’ does not name a type”,其报错原因和上面的代码是相同的,请看下面的代码:
a.h:

#ifndef A_H_INCLUDED
#define A_H_INCLUDED

#include "b.h"

class A
{
public:
    B *b;
};

#endif // A_H_INCLUDED

b.h:

#ifndef B_H_INCLUDED
#define B_H_INCLUDED

#include "a.h"

class B
{
public:
    A *a;
};

#endif // B_H_INCLUDED

main.cpp:

#include "a.h"
#include "b.h"

int main()
{
    return 0;
}

编译就会报错:“error: ‘A’ does not name a type”,为什么会这样呢?我们看看a.h经过预处理会展开成什么样子呢,预处理命令为“gcc -E -o a.i a.h”:

# 1 "a.h"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.h"



# 1 "b.h" 1



# 1 "a.h" 1
# 5 "b.h" 2

class B
{
public:
    A *a;
};
# 5 "a.h" 2

class A
{
public:
    B *b;
};

忽略以“#”开头的行,我们发现它现在和开头的那个源文件几乎是一样的,只是类的顺序交换了,因此出错原因和开头的那个源文件是一样的。
解决方法也很简单,把a.h的“#include “b.h””替换为B类的前置声明“class B;”,在b.h中也进行类似的修改。这样的话,就不会导致问题了。当然,这么做是有前提的:在A类中的成员只有B类的指针,而不能有B类的变量;同时不能在A类头文件中访问B类的成员或成员函数。无论哪种情况A类都需要知道B类的大小或其他细节,前置声明无法提供这些细节,又会出现类似“error: field ‘b’ has incomplete type ‘B’”这样的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前置声明与C++头文件互相包含导致的error: 'xxx' does not name a type问题 的相关文章

  • [技术讨论]keil常见问题报错及解决办法

    进行嵌入式开发过程中 xff0c keil是常用的一个工具 xff0c 但是在使用过程中经常会出现一些奇奇怪怪的问题 xff0c 其实很多问题都不难 xff0c 遇到过一次 xff0c 下次再遇到就知道怎么解决了 xff0c 我在这儿将我遇
  • PVE安装openwrt后,pve无法联网

    在pve中安装openwrt后 xff0c 有可能会出现pve系统无法连接外网的问题 有可能出现以下两种错误 xff1a 1 Temporary failure in name resolution 直接报dns的错误 2 failed N
  • Windows11/10 使用RDP远程桌面时提示 您的凭据不工作/登录没有成功可能的一种原因

    目录 看本文之前请先看问题背景解决 看本文之前请先看 微软官方的关于有关远程桌面客户端的常见问题 问题背景 Windows新装系统时就已经设置了Windows Hello 而登录系统时一直使用Windows Hello 未使用过密码进行登录
  • svn 查看检出记录

    http tortoisesvn net docs release TortoiseSVN zh CN tsvn repository hooks html 估计写一个服务器端的钩子脚本就能搞定 xff0c 你可以查阅相关的资料写一下 xf
  • C语言字符串——关于指针

    c字符串 我们知道在关于字符串的操作函数很多都包含在头文件 include lt string h gt 中 xff0c 例如计算字符串长度的函数strlen 今天我们们用自己的语言来实现一下关于字符串的复制 xff0c 连接 xff0c
  • MFC程序运行机制

    学MFC xff0c 竟然还不知道MFC的MAIN函数在什么地方 xff1f 怎么运行的 xff1f 实在不高明 看过候捷 JJHOU 老师的 深入浅出MFC 的 xff0c 对它一定很熟悉 呵呵 xff0c 本文是献给没有看过那本书 xf
  • Win7下硬盘安装Debian7.1

    在Ubuntu经常的崩溃和出问题的情况下 xff0c 终于决定转投Debian 在刻录光盘几次都失败后 xff0c 试着用硬盘安装的方式 xff0c 几经失败后 xff0c Debian终于装好了 xff0c 下面就把硬盘安装的方式写下来
  • iOS --- 为UISlider添加点击事件

    UISlider是iOS中非常常见的UI控件 继承自UIControl 可设置valueChanged等事件响应方法 但其默认不支持单击事件 本文即简单地实现了可单击选值的UISlider UISlider的常见IBAction Value
  • 阿里云linux服务器开启图形界面并用windows远程 并修改远程端口

    阿里云CentOS服务器安装图形界面 并安装xrdp远程 1 安装Gnonme yum groupinstall 34 GNOME Desktop 34 34 Graphical Administration Tools 34 y 如需卸载
  • 数论-约数和公式

    约数定义 约数 xff0c 又称因数 整数a除以整数b b 0 除得的商正好是整数而没有余数 xff0c 我们就说a能被b整除 xff0c 或b能整除a a称为b的倍数 xff0c b称为a的约数 在大学之前 xff0c 34 约数 34
  • 高手在民间——SDH、MSTP、OTN和PTN的区别和联系

    个人觉得作者总结得非常牛 xff0c 忍不住转载 分享 SDH MSTP OTN和PTN的区别和联系 首先要说的是TDM的概念 xff0c TDM就是时分复用 xff0c 就是将一个标准时长 xff08 1秒 xff09 分成若干段小的时间
  • bash:fdisk:command not found

    bash fdisk command not found lansir 64 Red Hat fdisk l bash fdisk command not found 原因是fdisk不在PATH路径中 lansir 64 Red Hat
  • java-A+B【NEUQACM】

    1002 A 43 B xff08 基本输入输出2 xff09 时间限制 1 Sec 内存限制 128 MB 提交 979 解决 668 提交 状态 讨论版 题目描述 输入两个数A B xff0c 输出A 43 B的值 输入 第一行是数据的
  • Opencv调取摄像头失败的处理方法

    最近想学习一下opencv xff0c 就弄了一本 学习opencv 的书看 xff0c 书中的例子也随便敲一敲 可是 xff0c 在调去摄像头时出现了如下问题 具体代码如下 xff1a include 34 stdafx h 34 inc
  • Python编辑器 Sublime text2 +JEDI(python自动补全插件)

    以前写python的时候都是用eclipse写的 用mac后 xff0c 今天突然看到了这个Sublime text2 xff0c 目测很好用 先记下来 xff0c 到时再来补充 Win Linux gt cmd 43 shifp 43 p
  • 连接MySQL出现Host is not allowed to connect to this MySQL server 解决方法

    一 报错的原因 xff1f 英语翻译 不允许主机连接到此MySQL服务器 xff08 意思是本地账号连接可以登录 xff0c 但是远程登陆不行 xff09 二 解决步骤 1 打开cmd 进入到php的bin文件 2 以下命令按顺序执行 1
  • Debian 安装并切换配置使用 Xfce 4 桌面环境

    1 首先 使用 sudo tasksel 选择安装 Xfce 4 环境 或者 通过 sudo apt install kali defaults kali root login desktop base xfce4 xfce4 places
  • Qt 设置Widget背景图片并实现透明度的三种方式

    一 场景 在平常的开发过程中 xff0c 我们常常会遇到需要设置Widget窗口背景图片透明度的方式 一般会有三种方式可以进行设置 二 方式一 xff08 使用图形遮罩功能SetMask函数 xff09 class BackGroundWi
  • 穿山甲的广告聚合平台-GroMore

    很多同学微信私聊问我 xff0c TogetherAd 和其他市面上的广告聚合平台有什么区别 xff1f 接了你这个收入会不会提高啊 xff1f 毕竟个人时间有限 xff0c 我很难每个同学都去详细的回答 这篇文章我们就深入的探讨一下 我见
  • 使用Python的Tkinter库创建GUI(附实例:回归)

    我们前面介绍了树回归中的回归树和模型树 两种回归方式 本节我们首先将树回归和标准回归进行比较 xff0c 然后创建出一个GUI xff0c 通过交互的形式更好去观察模型树和回归树之间的奥秘 1 树回归与标准回归的比较 我们之前介绍过几种回归

随机推荐

  • django-模板语言-传输各种数据类型

    复习 django的三种返回方式 HttpResponse render redirect 了解这三个功能的导入位置 from django shortcuts import HttpResponse render redirect 模板语
  • 数据结构—顺序表

    目录 绪论 逻辑结构 xff1a 数据的逻辑结构可以看作从具体问题抽象出来数学模型 xff0c 他与数据的存储无关 A 集合结构 B 线性结构 C 树形结构 D 图形结构 物理结构 xff1a 是指数据的逻辑结构在计算机中的存储形式 xff
  • C语言 求2*3矩阵的转置

    C语言 求2 3矩阵的转置 span class token macro property span class token directive hash span span class token directive keyword in
  • cmd找不到conda

    cmd找不到conda以及通过cmd启用Anaconda中的Python环境 xff08 base xff09 1 gt 在系统环境中添加Anaconda路径 在环境变量path中选择新建 xff0c 并将Anaconda安装目录下的Scr
  • 201409-2 画图

    试题编号 xff1a 201409 2 试题名称 xff1a 画图 时间限制 xff1a 1 0s 内存限制 xff1a 256 0MB 问题描述 xff1a 问题描述 在一个定义了直角坐标系的纸上 xff0c 画一个 x1 y1 到 x2
  • sublime 设置识别语言

    cmd 43 shift 输入语言入 object c 自动跳出 Set Syntax Object C 这样就能识别OC的代码片段了 个人觉得用sublime做代码片段管理比较好
  • vsftp local_umask=022 要不很郁闷的!

    先是最基本的配置 请看我的 etc vsftpd vsftpd conf 接受匿名用户 anonymous enable 61 YES 匿名用户login时不询问口令 no anon password 61 YES 接受本地用户 local
  • CSP202112-2序列查询新解java100分

    问题描述 试题编号 xff1a 202112 2试题名称 xff1a 序列查询新解时间限制 xff1a 1 0s内存限制 xff1a 512 0MB问题描述 xff1a 题目背景 上一题 序列查询 中说道 xff1a A 61 A0 A1
  • 【极速下载】gradle各版本快速下载地址大全

    灰机准备好 xff0c 我就是活雷锋 xff0c 持续更新欢迎 收藏 xff0c 若对您有帮助 xff0c 快来 赏个赞 xff01 如果没有你想要的版本 xff0c 可以留言 版本CSDN下载网盘下载更新时间gradle 8 1 1 al
  • 带括号的表达式求值(参考算法笔记)

    虽然算法原理很简单 xff0c 但是有几个地方需要注意 1 因为左括号是要放入操作符栈中的 xff0c 所以他的优先级要设置为0 xff0c 不然其他运算符来了 xff0c 就不知道能不能放进去 2 栈顶运算符优先级小于op时 xff0c
  • AWS部署方式对比和总结

    Hello大家好 xff0c 我们今天的课时对AWS的部署方式做一个对比和总结 部署方式 对于一个专家级解决方案架构师来说 xff0c 需要有在面对不同的业务需求时 xff0c 采用适合的部署方案的能力 我们前面的课时也讲了很多AWS提供的
  • ECS-弹性容器服务 - Part 1

    67 ECS 弹性容器服务 Part 1 Hello大家好 xff0c 我们今天的课时内容是ECS AWS的弹性容器服务 ECS AWS的弹性容器服务 ECS是高度可扩展的 快速的容器管理和编排服务 使用ECS xff0c 能够将您的Doc
  • Centos7上安装MySQL community步骤

    下载mysql80 community release el7 3 noarch rpm软件源包文件 MySQL Community Yum Repository Downloads shell gt sudo yum localinsta
  • Win10远程桌面账号正确但连接失败的解决方法(使用微软AzureAD的账号)

    百度到的那些改组策略之类的完全没用 xff0c 花了一个小时左右 xff0c 终于在谷歌找到了答案 xff01 https community spiceworks com topic 2048258 logon attempt faile
  • Ubuntu 20.04系统 安装显卡驱动RTX3080

    网络上很多 xff0c 试过很多前人的经验 xff0c 多多少少都有些奇怪问题特别是对于我这样的新手 我记录下 xff0c 仅代表我个人安装成功的经验 说明 xff0c 我是台式机安装Ubuntu 怎么安装完系统就不谈了 xff0c 主要说
  • SerDes---CDR技术

    1 为什么需要CDR 时钟数据恢复主要完成两个工作 xff0c 一个是时钟恢复 xff0c 一个是数据重定时 xff0c 也就是数据的恢复 时钟恢复主要是从接收到的 NRZ xff08 非归零码 xff09 码中将嵌入在数据中的时钟信息提取
  • Failed to start bean ‘documentationPluginsBootstrapper‘

    最近写项目发现导入Swagger2依赖会报错Failed to start bean documentationPluginsBootstrapper 这个错误是由Springfox的一个bug引起 xff0c 解决这个问题的方式有多种 x
  • mac,centos 安装Connector/Python

    mac 官网下载 xff0c 双击 centos https dev mysql com doc connector python en connector python installation source html sudo yum
  • 5个可保存的在线代码片段平台推荐-变成自己的代码词典库

    文章目录 1 谷歌等现代浏览器自带的代码片段2 github gitee gitcode等在线托管平台的gist列表3 各大在线IDE平台4 掘金代码片段5 在线笔记 1 谷歌等现代浏览器自带的代码片段 路径 xff1a 浏览器开发者工具
  • 前置声明与C++头文件互相包含导致的error: 'xxx' does not name a type问题

    在一个源文件中 xff0c 要声明或定义一个类的指针时 xff0c 必须在使用前声明或定义该类 xff0c 因此下面的代码会报错 xff1a span class hljs class span class hljs keyword cla