目录

c++ class “xxxx“ does not name a type是怎么一回事

C++编译报错:does not name a type

-------------------------------------------------------------

C++编译报错:does not name a type

  https://blog.csdn.net/weixin_43919570/article/details/113833141

前置声明(forward declaration)


[C++] does not name a type

  https://www.cnblogs.com/cjdty/p/14638288.html

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

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

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

===================================

c++ class “xxxx“ does not name a type是怎么一回事

declare class does not name a type

出现这个编译错误,

主要有四个可能原因,现总结如下:

1. 引用的类命名空间未包含

2. 引用的类头文件未包含

3. 包含了头文件,或者已经前置声明了,则说明所引用的类名写错。

4. 循环引用头文件 //一种方法,将头文件拆分?

前置声明要素:

1.前置声明需要注意以上提到的四点

2.尽可能的采用前置声明(做到只有包含继承类的头文件)

3.使用前置声明时,cpp文件中include 头文件次序必须先 包含前置声明的类定义头文件,再包含本类头文件。

否则会出现如下编译错误.

(expected constructor, destructor, or type conversion before ‘typedef')

https://blog.csdn.net/typename/article/details/7173550

 
原因二  前置声明

XXX应该是一种用户定义的数据类型,而由于没有声明或者拼写错误或者与关键词重名,导致编译有错,出现类型错误。

在一个源文件中,要声明或定义一个类的指针时,必须在使用前声明或定义该类,因此下面的代码会报错:class A{public:    B *b;};class B{public:    A *a;};int main(){    return 0;}12345678910111213141516

报错为“error: ‘B’ does not name a type”,就是因为在A类中使用B *b之前没有声明或定义B类,如果在第一行加上一句前置声明(forward declaration)“class B;”,就不会有这样的问题了。

class appv_forward;    //forward declaration  前置声明

class obu_data_channel_t              {
public:

 而在头文件互相包含时,也会引发“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”。

预处理命令为“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" 2class B{public: A *a;};

# 5 "a.h" 2class A{public: B *b;};1234567891011121314151617181920212223242526。
————————————————
版权声明:本文为CSDN博主「aFakeProgramer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/usstmiracle/article/details/106026446

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐