奇怪的编译问题 - 无法识别的类没有编译器错误
Weird compilation issue- no compiler errors for unrecognised class
我有太多代码要发布,但我不断收到重复的编译错误,即在整个项目中无法识别类Orderbk
。
最奇怪的是,Orderbk
中没有实际的编译错误(这可以理解地导致所有其他类无法识别它)。
有人可以给我线索,因为我的编译器在Orderbk
内部没有看到问题,但每个引用Orderbk
的类都报告它未定义,这可能是什么问题?
1>------ Build started: Project: FXDcr (Intel C++ 13.0), Configuration: Debug x64 ------
1> Derivative.cpp
1>C:DXDcrFXDcrInstr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:DXDcrFXDcrInstr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:DXDcrFXDcrStk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> FXDcr.cpp
1> FXMsg.cpp
1> Fut.cpp
1>C:DXDcrFXDcrInstr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:DXDcrFXDcrInstr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:DXDcrFXDcrStk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Index.cpp
1>C:DXDcrFXDcrInstr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:DXDcrFXDcrInstr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Instr.cpp
1>C:DXDcrFXDcrStk.h(13): error : not a class or struct name
1> class Stock : public Instr {
1> ^
1>
1>C:DXDcrFXDcrStk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:DXDcrFXDcrMappings.h(31): error : identifier "Instr" is undefined
1> static unordered_map<string, boost::shared_ptr<Instr> > GetDictOfAllInstrs();
1> ^
1>
1> Main.cpp
1>C:DXDcrFXDcrInstr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:DXDcrFXDcrInstr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Mappings.cpp
1>C:DXDcrFXDcrInstr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:DXDcrFXDcrInstr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Order.cpp
1> Stock.cpp
1>C:DXDcrFXDcrInstr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:DXDcrFXDcrInstr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> SIA.cpp
1>C:DXDcrFXDcrInstr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:DXDcrFXDcrInstr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:DXDcrFXDcrStk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
编辑我所有的头文件都是这样的格式:
#ifndef CLASS_H
#define CLASS_H
class CLASS{
};
#endif
每个编译单元中只能包含一次头文件,以避免重复定义。这是通过#ifdef
或其他解决方案完成的。
得到一个头文件循环,这会导致你在问题中提到的错误类型。
下面是一个示例(我只是使用 #pragma once
来表明该文件只包含一次,可能无法在任何地方使用):
头文件a.h
#pragma once
#include "b.h"
class A {
B b_instance;
};
头文件b.h
#pragma once
#include "a.h"
class B {
A a_instance;
};
代码文件program.cpp
#include "a.h"
#include "b.h"
编译program.cpp
时,首先包含a.h
。a.h
做的第一件事是包括 b.h
. 然后b.h
尝试包含a.h
,但它将被忽略,因为它已经包含在内。当解析 B 类时,它找不到A
因为我们还没有走a.h
那么远。
一种解决方案是在 heeader 文件中使用指针(如果可能)。
头文件b.h
#pragma once
class A;
class B {
A *a_instance;
public:
int do_stuff();
};
对于class A
的这个前向定义,我可以使用指向它的指针,因为编译器总是知道它们的大小。但是,我不能a_instance = new A();
或使用A
的成员,这必须b.cpp
代码文件b.cpp
#include "a.h"
int B::do_stuff() {
a_instance = new A();
// Or this
A my_instance;
}
相关文章:
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 编译器错误:destuctor 的更宽松的抛出说明符
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- C++ G++ 编译器 - 错误:隐式声明的定义
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 模板模板参数和模板别名:编译器错误?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 如何在C++中克服此 C4430 编译器错误?
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- C++自定义分配器大小参数作为模板参数会引发编译器错误