【问题标题】: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 类型的定义。

标签: c++


【解决方案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。 您需要告诉编译器 MyFooEncInstFooEncoder 在内部的样子,以便它能够访问任何成员。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多