函数原型认为一个类类型是未定义的,尽管它是在同一个头文件中定义的
Posted
技术标签:
【中文标题】函数原型认为一个类类型是未定义的,尽管它是在同一个头文件中定义的【英文标题】:Function prototype thinks a class type is undefined, although it's defined in the same header file 【发布时间】:2014-06-18 03:47:46 【问题描述】:似乎在 main 中声明并在头文件中定义的 IF_ID_WRITE 类对象无法被同一头文件中的函数原型识别。当我将原型从 Pipeline.h 移动到 Project.cpp 时,它编译得很好,但我不想这样做。
我需要进行哪些更改才能使其识别来自 Pipeline.h 的对象类型?
编译时出现以下三个错误: 错误 C2065:“IF_ID_WRITE”:未声明的标识符 错误 C2065:“aIF_ID_WRITE”:未声明的标识符 错误 C2182:“IF_stage”:非法使用“void”类型
Pipeline.h 文件包含#include <cstdlib>
#include <iomanip>
#include <iostream>
using namespace std;
#pragma once
//function prototypes
void IF_stage(IF_ID_WRITE &aIF_ID_WRITE);
//IF_ID_WRITE defined
class IF_ID_WRITE
private:
int inst;
int writeRegNum;
int readReg1Num;
int readReg2Num;
int offset;
int incrPC;
public:
IF_ID_WRITE();
void setWriteRegNum(int);
void setReadReg1Num(int);
void setReadReg2Num(int);
~IF_ID_WRITE()
;
Project.cpp 包含#include <cstdlib>
#include <iomanip>
#include <iostream>
#include "Pipeline.h"
using namespace std;
#pragma once
int main()
.
.
.
IF_ID_WRITE aIF_ID_WRITE; //creating an object called aIF_ID_WRITE of type IF_ID_WRITE
IF_stage(aIF_ID_WRITE); //a function that will pass the object by reference
在 Pipeline.cpp 文件中:void IF_stage(IF_ID_WRITE& aIF_ID_WRITE)
//code
已编辑以显示在 Pipeline.cpp 中定义的 IF_ID_WRITE
【问题讨论】:
IF_ID_WRITE
声明在哪里?它是在哪里定义的?
IF_ID_WRITE
类型在您的main
中没有定义,只是该类型变量的实例化。
IF_ID_WRITE 在 Pipeline.h 中声明。我将编辑问题以反映这一点。对不起
@DavidRodríguez-dribeas 我更改了它以反映在 Pipeline.h 中定义的 IF_ID_WRITE
@πάνταῥεῖ 对不起,我忘了在我的问题中表明这一点。我已经更新了。
【参考方案1】:
C++ 是一种自顶向下的语言,类型需要在声明使用它的函数之前声明。编译器不会前瞻来试图确定IF_ID_WRITE
是否存在于翻译单元的后面,它只会失败,因为它在函数之前不存在声明。
如果您重新排序 IF_ID_WRITE
类型的定义和它应该可以工作的函数。由于您只是在标头中声明函数,因此您还可以在函数声明之前提供类型声明(不需要定义):
class IF_ID_WRITE;
void IF_stage(IF_ID_WRITE& aIF_ID_WRITE);
[还有其他语法问题,例如析构函数缺少()
,但我假设这是复制粘贴到问题中的问题。我不太相信这一点,但我会跳过完整的代码审查]
【讨论】:
谢谢!改变顺序就可以了。复制粘贴中的析构函数 () 丢失。我会为任何可能出现并稍后查看的人修复它。再次感谢您的帮助!以上是关于函数原型认为一个类类型是未定义的,尽管它是在同一个头文件中定义的的主要内容,如果未能解决你的问题,请参考以下文章