Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的编译问题-未识别类没有编译器错误_C++_Debugging_Header_Compilation_Compiler Errors - Fatal编程技术网

C++ 奇怪的编译问题-未识别类没有编译器错误

C++ 奇怪的编译问题-未识别类没有编译器错误,c++,debugging,header,compilation,compiler-errors,C++,Debugging,Header,Compilation,Compiler Errors,我有太多的代码要发布,但我不断收到一个重复的编译错误,在我的项目中,类Orderbk不被识别 最奇怪的是,Orderbk中没有实际的编译错误(这可以理解,这会导致所有其他类都无法识别它) 有人能给我一些线索吗?我的编译器在Orderbk中没有发现问题,但是引用Orderbk的每个类都报告它未定义,这可能是错误的 1>------ Build started: Project: FXDcr (Intel C++ 13.0), Configuration: Debug x64 ------ 1

我有太多的代码要发布,但我不断收到一个重复的编译错误,在我的项目中,类
Orderbk
不被识别

最奇怪的是,
Orderbk
中没有实际的编译错误(这可以理解,这会导致所有其他类都无法识别它)

有人能给我一些线索吗?我的编译器在
Orderbk
中没有发现问题,但是引用
Orderbk
的每个类都报告它未定义,这可能是错误的

1>------ Build started: Project: FXDcr (Intel C++ 13.0), Configuration: Debug x64 ------
1>  Derivative.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
1>  FXDcr.cpp
1>  FXMsg.cpp
1>  Fut.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
1>  Index.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  Instr.cpp
1>C:\DXDcr\FXDcr\Stk.h(13): error : not a class or struct name
1>    class Stock : public Instr {
1>                         ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
1>C:\DXDcr\FXDcr\Mappings.h(31): error : identifier "Instr" is undefined
1>      static unordered_map<string, boost::shared_ptr<Instr> > GetDictOfAllInstrs();
1>                                                     ^
1>  
1>  Main.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  Mappings.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  Order.cpp
1>  Stock.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>  SIA.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1>      Orderbk getOrderbk();
1>      ^
1>  
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1>      Orderbk orderbk;
1>      ^
1>  
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1>          Orderbk orderbk;
1>          ^
1>  
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

头文件只能在每个编译单元中包含一次,以避免重复定义。这是通过
#ifdef
s或其他解决方案完成的

如果您有相互依赖的头文件,您将得到一个头文件循环,这将导致您在问题中提到的错误类型

下面是一个示例(我只使用
#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;
};
#pragma once
class A;
class B {
    A *a_instance;
    public:
    int do_stuff();
};
代码文件program.cpp

#include "a.h"
#include "b.h"
#include "a.h"
int B::do_stuff() {
        a_instance = new A();
        // Or this
        A my_instance;
}
编译
program.cpp
时,首先包括
a.h
a.h
所做的第一件事就是包含
b.h
b.h
然后尝试包含
a.h
,但它将被忽略,因为它已包含在内。当解析类B时,它找不到
A
,因为我们还没有在
A.h
中走那么远

一种解决方案是在heeader文件中使用指针(如果可能的话)

头文件
b.h

#pragma once
#include "a.h"
class B {
    A a_instance;
};
#pragma once
class A;
class B {
    A *a_instance;
    public:
    int do_stuff();
};
对于类A的正向定义,我可以使用指向它的指针,因为编译器总是知道它们的大小。然而,我不能做
a_instance=newa()
或使用
A
的成员,这必须进入
b.cpp

代码文件b.cpp

#include "a.h"
#include "b.h"
#include "a.h"
int B::do_stuff() {
        a_instance = new A();
        // Or this
        A my_instance;
}

头文件只能在每个编译单元中包含一次,以避免重复定义。这是通过
#ifdef
s或其他解决方案完成的

如果您有相互依赖的头文件,您将得到一个头文件循环,这将导致您在问题中提到的错误类型

下面是一个示例(我只使用
#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;
};
#pragma once
class A;
class B {
    A *a_instance;
    public:
    int do_stuff();
};
代码文件program.cpp

#include "a.h"
#include "b.h"
#include "a.h"
int B::do_stuff() {
        a_instance = new A();
        // Or this
        A my_instance;
}
编译
program.cpp
时,首先包括
a.h
a.h
所做的第一件事就是包含
b.h
b.h
然后尝试包含
a.h
,但它将被忽略,因为它已包含在内。当解析类B时,它找不到
A
,因为我们还没有在
A.h
中走那么远

一种解决方案是在heeader文件中使用指针(如果可能的话)

头文件
b.h

#pragma once
#include "a.h"
class B {
    A a_instance;
};
#pragma once
class A;
class B {
    A *a_instance;
    public:
    int do_stuff();
};
对于类A的正向定义,我可以使用指向它的指针,因为编译器总是知道它们的大小。然而,我不能做
a_instance=newa()
或使用
A
的成员,这必须进入
b.cpp

代码文件b.cpp

#include "a.h"
#include "b.h"
#include "a.h"
int B::do_stuff() {
        a_instance = new A();
        // Or this
        A my_instance;
}

您是否包含了
Orderbk
的标题?@xorguy我没有忘记其他每个.cpp文件的标题。Orderbk一定是出了什么问题。可能是您的Include引入了循环依赖项。使用前向类声明来打破这些限制。@PavelBeliy请参见问题底部的“我的编辑”-这些#ifndef应该消除循环引用?也许您需要链接到库?你有一个makefile吗?你有没有包括
Orderbk
的头?@xorguy我没有忘记其他每个.cpp文件的头。Orderbk一定是出了什么问题。可能是您的Include引入了循环依赖项。使用前向类声明来打破这些限制。@PavelBeliy请参见问题底部的“我的编辑”-这些#ifndef应该消除循环引用?也许您需要链接到库?你有makefile吗?只要在每个头文件的顶部加上“#pragma once”,我仍然会遇到同样的问题。
#pragma once
不是我的解决方案,它只是显示头只包含一次。我认为您的头文件中有相互依赖的代码,就像在我的示例中,
a.h
b.h
相互依赖,导致编译失败。好的,我找到了循环引用:)将尝试重新编写它,并让您知道它是否有效!我有两个!现在全部排序:)只需将“#pragma once”放在每个头文件的顶部,我仍然会遇到同样的问题。
#pragma once
不是我的解决方案,它只显示头文件只包含一次。我认为您的头文件中有相互依赖的代码,就像在我的示例中,
a.h
b.h
相互依赖,导致编译失败。好的,我找到了循环引用:)将尝试重新编写它,并让您知道它是否有效!我有两个!现在全部排序:)