缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int---->解决方法

本文详细介绍了在C++项目中遇到的头文件相互包含导致的编译错误,并提供了解决方法。通过修改包含方式,避免了头文件循环依赖,最终实现了代码的正确编译和运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写了一个对应让其出的错误(其实也挺不容易的喔 )

错误如下:

1>d:\work\win32project\testeachotherclude\testeachotherclude\test2.h(9): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1>d:\work\win32project\testeachotherclude\testeachotherclude\test2.h(9): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\work\win32project\testeachotherclude\testeachotherclude\test2.h(9): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\work\win32project\testeachotherclude\testeachotherclude\test2.h(10): error C2061: 语法错误: 标识符“Test1”
1>d:\work\win32project\testeachotherclude\testeachotherclude\testeachotherclude.cpp(15): error C2660: “Test2::className”: 函数不接受 1 个参数
1>d:\work\win32project\testeachotherclude\testeachotherclude\testeachotherclude.cpp(16): error C2039: “test1”: 不是“Test2”的成员
1>          d:\work\win32project\testeachotherclude\testeachotherclude\test2.h(7) : 参见“Test2”的声明
1>d:\work\win32project\testeachotherclude\testeachotherclude\testeachotherclude.cpp(16): error C2227: “->refMe”的左边必须指向类/结构/联合/泛型类型

上传Test方便大家看:

main.cpp

#include "stdafx.h"
#include "Test1.h"
#include "Test2.h"

int _tmain(int argc, _TCHAR* argv[])
{
	Test1* t1=new Test1();
	Test2* t2=new Test2();
	t1->className(t2);
	t1->test2->refMe();

	t2->className(t1);
	t2->test1->refMe();
	return 0;
}

再来看Test1的

Test1.h

#ifndef Test1_H
#define Test1_H

#include "Test2.h"

class Test1
{
public:
	Test2* test2;
	void Test1::className(Test2* test2);
	void refMe();
};
#endif;

Test1.cpp

#include "Test2.h"

void Test1::className(Test2* test2)
{
	this->test2=test2;
	std::cout<<"Test1  ";
}

void Test1::refMe()
{
	std::cout<<"refMe Test1"<<std::endl;
}

Test2.h

#ifndef Test2_H
#define Test2_H

#include "Test1.h"

class Test2
{
public:
	Test1* test1;
	void className(Test1* test1);
	void refMe();
};
#endif

Test2.cpp

#include "StdAfx.h"
#include "Test2.h"
#include <iostream>

void Test2::className(Test1* test1)
{
	this->test1=test1;
	std::cout<<"Test2  ";
}

void Test2::refMe()
{
	std::cout<<"refMe Test2"<<std::endl;
}


然后运行就报上面的一对错误了...

仔细看看发现两个头文件都彼此包含了,就是这个问题啦...那我们怎么解决了,上传我的代码,直接看这样更容易理解  main.cpp不变

Test1.h

#ifndef Test1_H
#define Test1_H
//#include "Test2.h" //用下面的方式替代
class Test2;//注意:只是告诉编译器,需要这个类,其他功能结构等都没

class Test1
{
public:
	Test2* test2;
	void Test1::className(Test2* test2);
	void refMe();
};
#endif;


 Test1.cpp

#include "StdAfx.h"
#include "Test1.h"
#include <iostream>

#include "Test2.h" //注意:这里才是真正的包含

void Test1::className(Test2* test2)
{
	this->test2=test2;
	std::cout<<"Test1  ";
}

void Test1::refMe()
{
	std::cout<<"refMe Test1"<<std::endl;
}


Tes2的我就不贴了,一样的道理,编译运行ok ....


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Potter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值