C++ ';运营商苹果&x27;包含标头时不是可识别的运算符或类型

C++ ';运营商苹果&x27;包含标头时不是可识别的运算符或类型,c++,visual-c++,operator-overloading,C++,Visual C++,Operator Overloading,我会把它缩短 我有两门课:Apple和Orange,如下所示: #ifndef APPLE_H_ #define APPLE_H_ #include "Orange.h" class Apple {}; #endif /* APPLE_H_ */ Apple.h(Apple.c为空) Orange.h: #ifndef ORANGE_H_ #define ORANGE_H_ #include "Apple.h" class Orange { public: Orange();

我会把它缩短

我有两门课:
Apple
Orange
,如下所示:

#ifndef APPLE_H_
#define APPLE_H_

#include "Orange.h"

class Apple {};

#endif /* APPLE_H_ */
Apple.h
Apple.c
为空)

Orange.h

#ifndef ORANGE_H_
#define ORANGE_H_

#include "Apple.h"

class Orange {
public:
    Orange();
    virtual ~Orange();
    operator Apple ();
};

#endif /* ORANGE_H_ */
Orange.cpp

#include "Orange.h"

Orange::Orange() {
    // TODO Auto-generated constructor stub

}

Orange::~Orange() {
    // TODO Auto-generated destructor stub
}

Orange::operator Apple() {
    Apple y;
    return y;
}
正如这些,这些都是伟大的作品

但当我将
#include“Orange.h”
添加到
Apple.h
时,我得到
“operator Apple”不是一个可识别的运算符或类型
错误

详情如下:

#ifndef APPLE_H_
#define APPLE_H_

#include "Orange.h"

class Apple {};

#endif /* APPLE_H_ */

#include“Orange.h”
造成了什么问题?

这是因为您现在有一个循环依赖:
Orange.h
依赖于
Apple.h
,它依赖于
Orange.h

Orange.h
头文件中,声明
Apple
类就足够了:

// Tell the compiler that there is a class named `Apple`
class Apple;

class Orange {
public:
    Orange();
    virtual ~Orange();
    operator Apple ();
};

然后在
Orange.cpp
源文件中包含
Apple.h
头文件。

循环包含是问题所在。实际上,该代码应该可以工作,
Orange.cpp
包括
Orange.h
,其中包括
Apple.h
,但不包括
Orange.h
,因为
Orange\u h\u\u已经定义,或者我错了吗?您需要在
Orange.h
中向前声明
Apple
类Apple@filmor没有预处理器错误。这完全是错误的。如果
Apple.h
包含
Orange.h
Orange.h
将再次尝试包含
Apple.h
(但由于
Apple\u\u\u
保护,它将不起任何作用),您将得到
Orange
类定义,该类定义在声明
Apple
Apple
之前引用
Apple
类型。@filmorah,我明白你的意思。是的,也许有什么事情是OP没有告诉我们的。(不管怎样,循环的
#include
仍然是个坏主意。)不完全是这样,但我用你的技巧找到了一个解决办法。谢谢我会等待更多的答案——不会的,我会把你的标记为最好的。谢谢