成员访问不完整类型错误

时间:2016-11-22 08:17:23

标签: c++

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

3 个答案:

答案 0 :(得分:3)

foo.h声明了一个只在foo.c中定义的结构的类型定义,因此foo_interface.cc无法看到FooEncoder实际上是什么。您可以通过将结构定义从foo_encoder.c移动到foo.h来解决此问题。

答案 1 :(得分:3)

您要求FooEncoder结构中的成员在 foo_interface.cc 文件中的任何位置都不可见。这类似于pimpl idiom

为了让您的代码了解FooEncoder的结构,您需要

#include "foo_encoder.c"
foo_interface.cc 文件中的

(我完全不喜欢这个解决方案,你也没有发布完整的代码)或者将你的结构定义移到头文件的其他地方并包含那个(推荐)。

答案 2 :(得分:0)

您尝试访问的类型仅在您尝试访问时正向声明。您可以查看此question to learn what a forward declaration is,同时answers to this questions解释何时可以使用前向声明,何时不能使用。

foo.h 中的typedef基本上充当类型FooEncoder的前向声明。您将文件包含在 foo_interface.cc 中。所以编译器知道类型存在但是它对内部结构一无所知,比如它有什么成员。因此,它不知道是否有像您要求它访问的成员C。 您需要告诉编译器内部MyFooEncInstFooEncoder的内容,以便能够访问任何成员。