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

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

错误如下:

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 ....


  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
计算机图形学课程实验 报 告 实验题目 设计算法绘制直线与圆 班 级 姓 名 学 号 指导教师 日 期 "实验说明 试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。 试验地点: 教九楼401 数学系机房 实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC或C++,也可使用其它语言;3.请在自己的实验 报告上写明、学号、班级;4.每次交的实验报告容包括:题目、试验目的和意义、程序 制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。 "实验容 :实验题一 1.1实验题目 1).用DDA法在屏幕上画一条具有三个像素宽的直线段L1。要求:(1)直线段L1的两个 端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画 出直线的同时要求标明两端点坐标。 2).将课堂所讲的斜率0<K<1的中点画线算法推广到斜率K>1、-1<K<0和K<- 1的情况,编写一通用的中点画线算法。 1.2实验目的和意义 1.了解如何利用C语言和图形函数进行绘图; 2. 熟悉并掌握C语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数; 3. 通过对Turbo C进行图形程序设计的基本方法的学习,能绘制出简单的图形; 4. 熟悉并掌握DDA法在屏幕上画一条具有三个像素宽的直线段L1以及通用的中点画线算法。 通过DDA法及用的中点画线算法,了解图形系统初始化、图形系统关闭和图形模式的控制 ,并熟练运用图形坐标的设置,包括定点、读取光标以及图形颜色的设置。 1.3程序制作步骤(包括算法思想、算法流程图等) 1.自动搜索显示器类型和显示模式,初始化图形系统,通过printf、scanf语句控制线段 的端点坐标和画线颜色的自由输入; 2. DDAline:设直线之起点为(x1,y1),终点为(x2,y2),则斜率k为: 则有: .可通过计算由x方向的增量引起y的改变生成直线。由 (为直线上某步的初值)则 .也可通过计算由y方向的增量引起x的改变生成直线。由(为直线上某 步的初值)则: 3.Midpointline: .假定X坐标为的各像素点中,与直线最近点已确定为 (用实心小圆表示),那么下一个与直线最近的象素点只能是正右方的或右上方 两者之一。 . 再以M表示P1与P2的中点,即又设Q是理想直线与垂直线的交点 。显然有: .当M在Q的下方,则P2 离直线 近,应取为下一个象素点; .当M在Q的上方,则P1离直线 近,应取为下一个象素点。 .当M和Q重合,则P 1和P2离直线 一样近,两者均可取为下一个象素点 1.4主程序 1.4.1 DDA算法 #include "graphics.h" #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <math.h> DDAline(int x1, int y1, int x2, int y2, int c) { float delta_x = 0; float delta_y = 0; float x = 0; float y = 0; int dx= 0; int dy = 0; int steps = 0; int k = 0; dx=x2-x1; dy=y2-y1; if (abs(dx)>abs(dy)) { steps=3*abs(dx); } else { steps=3*abs (dy); } delta_x=(float)dx / (float)steps; delta_y=(float)dy / (float)steps; x=float(x1); y=float(y1); for (k=1; k<=steps;k++) { putpixel(int(x+0.5), int(y+0.5), c); x+=delta_x; y+=delta_y; } return 0; } void main() { char t[100] = {0}; int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; int c = 0; void dda_line(int x1,int y1,int x2,int y2,int c); int graphdriver=DETECT,graphmode; initgraph(&graphdriver,&graphmode,"D:\\TC"); /*初始化图形系统*/ printf("输入两端点坐标:\n"); scanf("<%d,%d>,<%d,%d>",&x1,&y1,&x2,&y2); printf("输入画线颜色:\n");
网上下载了emule0.50a-Xtreme8.1-sources源码,声称可以在VS2008下直接编译成功,经我实际测试,系统会报错,其中第一类错误,由于系统中为了兼容VISTA/WIN7,增加了相关定义,而这些定义在XP/WIN2003环境下会报错,共771个错误,如: 错误 2 error C2065: “ITaskbarList3”: 未声明的标识符 d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 195 emule 错误 3 error C2146: 语法错误 : 缺少“;”(在标识符“m_thbButtons”的前面) d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 196 emule 错误 4 error C4430: 缺少类型说明符 - 假定int注意: C++支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 196 emule 错误 5 error C4430: 缺少类型说明符 - 假定int注意: C++支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 196 emule 错误 6 error C2146: 语法错误 : 缺少“;”(在标识符“m_currentTBP_state”的前面) d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 198 emule 错误 7 error C4430: 缺少类型说明符 - 假定int注意: C++支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 198 emule 错误 8 error C4430: 缺少类型说明符 - 假定int注意: C++支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 198 emule 错误 10 error C2065: “ITaskbarList3”: 未声明的标识符 d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 195 emule ...... 此类错误中,ITaskbarList3是VISTA/WIN7环境下与任务栏相关的变量,只要屏闭掉相关定义就能正常。 除此之外还报有下面 5 个错误(实际引起错误的位置只有两个): 错误 135 error C2059: 语法错误 : “:” d:\eMule\srchybrid\BaseClient.cpp 1603 emule 错误 136 error C2065: “tagName”: 未声明的标识符 d:\eMule\srchybrid\BaseClient.cpp 1604 emule 错误 137 error C2228: “.WriteTagToFile”的左边必须有类/结构/联合 d:\eMule\srchybrid\BaseClient.cpp 1604 emule 错误 139 error C2001: 常量中有换行符 d:\eMule\srchybrid\BaseClient.cpp 4832 emule 错误 140 fatal error C1057: 宏展开中遇到意外的文件结束 d:\eMule\srchybrid\BaseClient.cpp 4832 emule 此类错误中,实际上是是两个语法错误,由于太过简单,我与网友都怀疑是作者故意制造的错误,若是完全不懂C++的人,即使拿到源码,编也会报错,从而止步于此。而稍懂C++的人(本人即是此类菜鸟),则可以找出错误之处。 为方便诸多象我一样的初学者,我把修正之后,可以在 XP/WIN2003 +VS2003SP1 环境下直接编译成功的emule0.50a-Xtreme8.1-sources源码发布上来,以便互相学习交流。
### 回答1: 这个错误提示意味着你在声明变量时没有指定变量的类型,而 C++支持默认类型int。因此,编译器无法确定变量的类型,从而导致了错误。 要解决这个问题,你需要在声明变量时显式地指定变量的类型。例如,如果你想声明一个整数变量,应该这样写: ``` int myInt; ``` 如果你想声明一个浮点数变量,应该这样写: ``` float myFloat; ``` 如果你已经指定了变量的类型,但仍然收到此错误提示,那么可能是因为你的代码中存在语法错误或拼写错误。你可以检查一下代码中是否有这样的问题。 ### 回答2: error c4430是指在C语言编译器中出现了缺少类型说明符的错误,提示假定int类型。需要注意的是,C语言不支持默认int类型,因此如果在代码中没有显式地声明变量类型,编译器会报出这个错误。 这个错误通常出现在以下两种情况下: 1. 变量没有声明类型 在C语言中,定义一个变量必须先声明它的类型。如果一个变量没有声明类型,编译器就无法识别它的类型,在编译时就会出现error c4430错误。 例如: x = 10; 这段代码就会出现error c4430错误,因为x没有声明类型。 要解决这个错误,我们需要在定义变量时同时声明它的类型,例如: int x = 10; 2. 头文件顺序问题 另一种情况是,在头文件中定义变量时,如果头文件的顺序不正确,就会导致编译器无法找到变量的定义,从而产生error c4430错误。 例如: #include "b.h" #include "a.h" 这种情况下,如果变量在b.h中定义而在a.h中使用,就会出现error c4430错误。 要解决这个问题,我们需要将头文件包含的顺序调整正确,将使用的头文件放在前面,定义的头文件放在后面,如下所示: #include "a.h" #include "b.h" 总之,出现error c4430错误时,需要仔细检查代码中的变量声明和头文件的顺序,保证变量都被正确声明并且头文件顺序正确。 ### 回答3: error c4430: 缺少类型说明符 - 假定int。这个错误提示是在C++编译过程中出现的,它表明在代码中缺少类型说明符,导致编译器无法识别其类型,因而会默认int类型。所以我们需要在代码中添加类型说明符,以便编译器正确识别。 需要注意的是,C语言并不支持默认int类型,这是与C++语言不同的地方。在C中,如果我们没有显式地指定变量的类型,编译器会默认为未定义类型,这将导致编译错误。而在C++中,如果我们没有显式指定变量类型,编译器会默认int类型,这就是为什么我们会看到这个错误提示。 为了解决这个错误,我们应该检查代码中是否有缺少类型说明符的情况,并为这些变量添加适当的类型说明符。如果代码中使用了大量的变量而没有指定类型,可以考虑在头文件中定义一个结构体,将这些变量作为结构体的成员,这样可以统一管理,并且可以避免出现类型错误。 在C++中,我们可以使用auto关键字来实现自动类型推断,这样可以避免一些类型错误,但需要注意的是,auto并不适用于所有情况,有些类型必须我们手动指定。 总之,解决error c4430错误,需要引起我们重视和审慎处理,要深入分析代码,增加类型说明符,并严格遵守C++语法规范,这样才能避免出现类似错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值