c++ class “xxxx“ does not name a type是怎么一回事
declare class does not name a type
出现这个编译错误主要有四个可能原因,现总结如下:
1.引用的类命名空间未包含
2.引用的类头文件未包含
3.包含了头文件,或者已经前置声明了,则说明所引用的类名写错。
4.循环引用头文件
前置声明要素:
1.前置声明需要注意以上提到的四点
2.尽可能的采用前置声明(做到只有包含继承类的头文件)
3.在使用前置声明时,在C/C++源代码中编译器处理顺序要求应在编译器处理顺序要求之前包含前向声明的类定义头文件,在编译器处理顺序要求之后再包含当前类的头文件以确保正确的编译和链接过程
否则会出现如下编译错误.
(expected constructor, destructor, or type conversion before ‘typedef')
原因二 前置声明
据推测
据推测
在同一个源文件内,当在一个源文件中声明或定义一个类的指针时,则必须在其被引用之前先对该类进行相应的声明或定义;否则会导致编译错误。例如以下代码将无法编译成功:class A { public: B *b; }; class B { public: A *a; }; int main() { return 0; };
报告错误信息为"error: 'B' does not name a type"表明,在A类体中使用未预先声明或定义的B类指针变量(*b)会导致此错误。若在代码初始段添加一条前向声明(例如"class B;"),则可规避此问题的发生
class appv_forward; //forward declaration 前置声明
class obu_data_channel_t {
public:
当相互包含的头文件被引用时,在编译器处理过程中也会触发这个错误信息:error: [xxx](https://www.baidu.com/s?wd=xxx&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao) 不命名一个类型。“其报错原因与上面讨论的代码情况一致。”
请看下面的代码: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”:
