似乎在主文件中声明并在头文件中定义的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
答案 0 :(得分:2)
C ++是一种自上而下的语言,在声明使用它的函数之前,类型需要声明。编译器不会预测试图弄清楚IF_ID_WRITE
以后是否存在于翻译单元中,它只会失败,因为它不会存在于函数声明之前。
如果您重新排序IF_ID_WRITE
类型的定义及其应该起作用的功能。由于您只是在标题中声明了该函数,因此您还可以在函数声明之前提供类型声明(不需要 definition ):
class IF_ID_WRITE;
void IF_stage(IF_ID_WRITE& aIF_ID_WRITE);
[还有其他语法问题,例如析构函数缺少()
,但我假设这是复制粘贴到问题中的问题。我不相信这一点,但我会跳过完整的代码审查]