2016-11-22 35 views
1

我有以下文件结构包含一个结构的封装类型的定义,当我尝试访问结构的成员,我得到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在另一个地方所定义。

+0

将foo_encoder.c包含到代码中,它将起作用。之后让我知道,并会给出完整的答案。另一种方法是在新的.h文件中对struct FooEncoder进行全面定义并包含它。 – Nick

+0

您正尝试访问“MyFooInst *”类型变量的成员。但是,在您提供的代码中没有“MyFooInst”类型的定义。 – sigy

回答

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来解决此问题。

0

您尝试访问的类型仅在您尝试访问时才提前声明。你可以看看这个question to learn what a forward declaration is,而answers to this questions解释什么时候你可以使用前向声明,什么时候你不能。

您的typedef foo.h基本上充当FooEncoder类型的前向声明。您将文件包含在foo_interface.cc中。因此,编译器知道,类型存在,但它不知道其内部的任何内容,例如它具有的成员。因此它不知道是否有成员C就像您请求访问。 您需要告诉编译器如何MyFooEncInstFooEncoder看起来像内部它能够访问任何成员。