字段‘;价值’;有不完整的类型 我有一个C++的相互依赖问题,我不明白问题在哪里……

字段‘;价值’;有不完整的类型 我有一个C++的相互依赖问题,我不明白问题在哪里……,c++,class,compilation,C++,Class,Compilation,以下是我的标题: json.array.h #ifndef __JSON_ARRAY__ #define __JSON_ARRAY__ #include "json.object.h" class JSON_OBJECT; /* JSON_ARRAY */ class JSON_ARRAY { int size; custom_list<JSON_OBJECT> * container; ... }; #endif elem_info.h #ifndef

以下是我的标题:

json.array.h

#ifndef __JSON_ARRAY__
#define __JSON_ARRAY__

#include "json.object.h"

class JSON_OBJECT;

/* JSON_ARRAY */
class JSON_ARRAY {
    int size;
    custom_list<JSON_OBJECT> * container;

...
};

#endif
elem_info.h

#ifndef __ELEM_INFO__
#define __ELEM_INFO__

#include "json.type.h"
class JSON_TYPE;

class elem_info {
public:
    std::string key;
    JSON_TYPE value;
...
}; 

#endif
main.cpp

#include <iostream>
#include <string>

#include "custom_list.h" // it inculdes cpp also
#include "json.type.h"
#include "elem_info.h"
#include "json.object.h"
#include "json.array.h"
#include "json.type.cpp"
#include "elem_info.cpp"
#include "json.object.cpp"
#include "json.array.cpp"


int main()
{
    JSON_ARRAY * root = new JSON_ARRAY;
    JSON_OBJECT obj;
    JSON_OBJECT obj1;
    JSON_OBJECT * obj2 = new JSON_OBJECT;
    JSON_TYPE * type = new JSON_TYPE;
...
}
#包括
#包括
#包括“custom_list.h”//还包括cpp
#包括“json.type.h”
#包括“elem_info.h”
#包括“json.object.h”
#包括“json.array.h”
#包括“json.type.cpp”
#包括“elem_info.cpp”
#包括“json.object.cpp”
#包括“json.array.cpp”
int main()
{
JSON_数组*root=新的JSON_数组;
对象对象对象;
JSON_对象obj1;
JSON_对象*obj2=新的JSON_对象;
JSON_类型*类型=新的JSON_类型;
...
}
当我试图编译代码时,出现以下错误:

elem_info.h:10:15:错误:字段“值”的类型不完整 JSON_类型值


看起来它找不到JSON_类型。我不明白问题出在哪里。

您这里有一份转发声明

class JSON_TYPE;

class elem_info {
public:
    std::string key;
    JSON_TYPE value;
...
}; 
但是
value
JSON\u类型的一个实例。只有当成员是指针或引用而不是实际实例时,才能进行前向声明

事实上,因为在转发声明之前有一个完整的include,所以根本不需要转发声明,正如我所说的,它对您没有任何帮助。你可以:

#ifndef __ELEM_INFO__
#define __ELEM_INFO__

#include "json.type.h"

class elem_info {
public:
    std::string key;
    JSON_TYPE value;
...
}; 

#endif

这里有一份远期申报单

class JSON_TYPE;

class elem_info {
public:
    std::string key;
    JSON_TYPE value;
...
}; 
但是
value
JSON\u类型的一个实例。只有当成员是指针或引用而不是实际实例时,才能进行前向声明

事实上,因为在转发声明之前有一个完整的include,所以根本不需要转发声明,正如我所说的,它对您没有任何帮助。你可以:

#ifndef __ELEM_INFO__
#define __ELEM_INFO__

#include "json.type.h"

class elem_info {
public:
    std::string key;
    JSON_TYPE value;
...
}; 

#endif
你不能这样做:

class JSON_TYPE;

class elem_info {
public:
    std::string key;
    JSON_TYPE value;
...
}; 
JSON_类型
是一个不完整的类型。您可以有一个指针或引用,但没有实际实例,因为编译器不知道它是什么。

您不能执行以下操作:

class JSON_TYPE;

class elem_info {
public:
    std::string key;
    JSON_TYPE value;
...
}; 

JSON_类型
是一个不完整的类型。您可以有一个指针或引用,但没有实际实例,因为编译器不知道它是什么。

json.type.h
包括
json.array.h
,其中包括
json.object.h
,其中包括
json.type.h


那不行。

json.type.h
包括
json.array.h
,其中包括
json.object.h
,其中包括
json.type.h


那不行。

谢谢你的快速回答。不是真的。他在[多余的]转发声明之前加入了完整的定义-1@LightnessRacesinOrbit我只是注意到问题比我说的要多得多。这应该删除吗?考虑它解决了。我改变了所有的方法。现在,有了指针,它就可以工作了。再次感谢你,内森。谢谢你的快速回答。不是真的。他在[多余的]转发声明之前加入了完整的定义-1@LightnessRacesinOrbit我只是注意到问题比我说的要多得多。这应该删除吗?考虑它解决了。我改变了所有的方法。现在,有了指针,它就可以工作了。再次感谢你,内森。但不是因为他有循环收录。不是因为他有循环收录。