成员访问进入不完整类型错误
Posted
技术标签:
【中文标题】成员访问进入不完整类型错误【英文标题】:Member access into incomplete type error 【发布时间】:2016-11-22 08:17:23 【问题描述】:我有以下包含封装类型结构定义的文件结构,当我尝试访问该结构的成员时,我收到Member access into incomplete type
错误。问题是什么?
foo_encoder.c:
#include "foo.h"
//...
struct FooEncoder
int A;
int B;
foo_int32 C;
//...
foo.h:
extern "C"
typedef struct FooEncoder FooEncoder;
//...
foo_interface.h:
typedef struct MyFooEncInst FooEncInst;
foo_interface.cc:
#include "foo_interface.h"
#include "foo.h"
//...
struct MyFooEncInst
FooEncoder* encoder;
;
//...
MyFoo_Encode(FooEncInst* inst,...)
//...
if (d > inst->encoder->C) // This is where I get the error
//...
foo_int32
在其他地方定义。
【问题讨论】:
inlcude foo_encoder.c 到代码中,它将起作用。之后让我知道,并给出完整的答案。另一种方法是在新的 .h 文件中完整定义 struct FooEncoder 并包含它。 您正试图访问MyFooInst*
类型变量的成员。但是,在您提供的代码中没有MyFooInst
类型的定义。
【参考方案1】:
您正在请求FooEncoder
结构中的成员,该成员在您的 foo_interface.cc 文件中的任何位置均不可见。这看起来类似于pimpl idiom。
为了让您的代码了解FooEncoder
的结构,您需要
#include "foo_encoder.c"
在你的 foo_interface.cc 文件中(我很不喜欢这个解决方案,你也没有发布完整的代码)或将你的结构定义移动到头文件中的其他位置并包含那个(推荐)。
【讨论】:
【参考方案2】:foo.h 正在向仅在 foo.c 中定义的结构声明类型定义,因此 foo_interface.cc 无法了解 FooEncoder 的实际含义。您可以通过将结构定义从 foo_encoder.c 移动到 foo.h 来解决此问题。
【讨论】:
【参考方案3】:您尝试访问的类型仅在您尝试访问时前向声明。你可以看看这个question to learn what a forward declaration isanswers to this questions解释什么时候可以使用前向声明,什么时候不能。
foo.h 中的 typedef 基本上充当 FooEncoder
类型的前向声明。您将文件包含在 foo_interface.cc 中。所以编译器知道类型存在,但它不知道它的内部结构,比如它有什么成员。因此它不知道是否有像您请求它访问的成员C
。
您需要告诉编译器 MyFooEncInst
和 FooEncoder
在内部的样子,以便它能够访问任何成员。
【讨论】:
以上是关于成员访问进入不完整类型错误的主要内容,如果未能解决你的问题,请参考以下文章