zoukankan      html  css  js  c++  java
  • error C2504 base class undefined

    今天遇到的bug,觉得很诡异,明明引用了头文件却找不到基类定义,百度之后解决,觉得是个值得注意的地方,很细小,但是很难查~~~以后注意!引以为戒。

    之前写程序时,最喜欢把类的头文件全部放到stdafx.h 或类似自定义的某个头文件中(如include_files.h),然后在不同的文件中需要调用别的文件中的类或变量或函数什么的,只要直接#include "include_files.h"就行了,今天终于遇到了error C2504错误。具体说明如下:

          有以下几个文件:include_files.h AA.h AA.cpp BB.h BB.cpp

    //include_files.h
    #pragma once
    ...
    #include "AA.h"
    #include "BB.h"
    ...
    
    // AA.h
    #include "include_files.h"
    class AA
    {
    public: ...
    };
    
    // BB.h
    #include "include_files.h"
    class BB : public AA
    {
    public: ...
    }

    编译后就会报错C2504,未定义基类AA,msdn上的解释是这样的:

     

    • Missing include file.  未包含头文件
    • External base class not declared with extern.  外部类没有用ertern定义。

    而这个错误就是因为头文件包含得不明确。

    编译时,首先编译了AA.h,

    因为AA.h中包含了include_files.h,所以又去编译了include_files.h

    include_files.h里即包含AA.h又包含BB.h,所以继续编译

    AA.h正在编译中,于是再去编译BB.h,而BB.h未编译,但它里面却用到了类AA,然而此时我们仍在编译AA.h的嵌套中,即AA.h未编译完,显然类AA还没有明确定义,所以才报了错。即如下一个过程。

    所以以后不能把类定义的头文件随便扔在一块了,还是勤快些,在用到时才#include吧。。。




    keep calm and carry on
  • 相关阅读:
    Change the default MySQL data directory with SELinux enabled
    CentOS7使用firewalld打开关闭防火墙与端口
    常用screen参数
    Android手机上浏览器不支持带端口号wss解决方案
    How to Create Triggers in MySQL
    QT GUI @创建新的工程
    Linux内核源代码的结构(转)
    ARM体系的7种工作模式
    C语言中强制数据类型转换(转)
    Linux驱动设计—— 中断与时钟@request_irq参数详解
  • 原文地址:https://www.cnblogs.com/geekvc/p/6657304.html
Copyright © 2011-2022 走看看