【问题标题】:How to resolve error: invalid use of incomplete type ‘GdkSurface {aka struct _GdkSurface}’?如何解决错误:无效使用不完整类型“GdkSurface {aka struct _GdkSurface}”?
【发布时间】:2021-05-24 05:00:49
【问题描述】:

关于incomplete type 错误的问题已经在这里经常被问到,但是那里提供的所有解决方案对我的情况都没有帮助。添加前向声明没有意义,因为GdkSurface 已经在 Gdk 标头中进行了前向声明。包括适当的标题已经完成。在产生错误的代码部分之后 + 包含。

#include <gdkmm/display.h>
#include <gdkmm/surface.h>

extern "C" {
#include <gdk/x11/gdkx.h>
#include <gdk/gdk.h>
}

extern "C" {
    void surface_move(Gdk::Surface* psurface, int x, int y) {
        #ifdef GDK_WINDOWING_X11
        GdkSurface* surface = psurface->gobj();
        GdkSurface *impl = GDK_X11_SURFACE(surface);
        XMoveWindow(GDK_SURFACE_XDISPLAY (surface), GDK_SURFACE_XID (surface), x * impl->surface_scale, y * impl->surface_scale);
        #endif
    }
}

以下是完整的错误:

src/utils.cpp: In function ‘void Gdk::surface_move(Gdk::Surface*, int, int)’:
src/utils.cpp:9:83: error: invalid use of incomplete type ‘GdkSurface {aka struct _GdkSurface}’
 (GDK_SURFACE_XDISPLAY (surface), GDK_SURFACE_XID (surface), x * impl->surface_scale, y * impl->surface_scale);
                                                                     ^~
In file included from /home/user/.local/built/include/gtk-4.0/gdk/gdkapplaunchcontext.h:29:0,
                 from /home/user/.local/built/include/gtk-4.0/gdk/gdk.h:30,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/enums.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/event.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/display.h:30,
                 from ./include/libgdp/utils.hpp:3,
                 from src/utils.cpp:1:
/home/user/.local/built/include/gtk-4.0/gdk/gdktypes.h:97:16: note: forward declaration of ‘GdkSurface {aka struct _GdkSurface}’
 typedef struct _GdkSurface             GdkSurface;
                ^~~~~~~~~~~
src/utils.cpp:9:108: error: invalid use of incomplete type ‘GdkSurface {aka struct _GdkSurface}’
 rface), GDK_SURFACE_XID (surface), x * impl->surface_scale, y * impl->surface_scale);
                                                                     ^~
In file included from /home/user/.local/built/include/gtk-4.0/gdk/gdkapplaunchcontext.h:29:0,
                 from /home/user/.local/built/include/gtk-4.0/gdk/gdk.h:30,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/enums.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/event.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/display.h:30,
                 from ./include/libgdp/utils.hpp:3,
                 from src/utils.cpp:1:
/home/user/.local/built/include/gtk-4.0/gdk/gdktypes.h:97:16: note: forward declaration of ‘GdkSurface {aka struct _GdkSurface}’
 typedef struct _GdkSurface             GdkSurface;
                ^~~~~~~~~~~

我使用 JHbuild 构建了 Gdk、Gtk、Gdkmm 和 Gtkmm。

【问题讨论】:

  • “但是那里提供的所有解决方案对我的情况都没有帮助” - 这在很大程度上没有提供信息。您的案例有何不同之处?不要只是告诉我们这不是一个重复的问题; 证明不是。
  • 您的示例代码远非最小。我希望minimal reproducible example 中的函数由触发错误的 one 行以及该行所需的任何定义组成。此时,您的错误日志应该足够短,以至于您不会回避将错误消息复制到问题本身。链接过时了,所以不要依赖它们。
  • @JaMiT 我编辑了我的问题

标签: c++ gtk gtkmm incomplete-type gdk


【解决方案1】:

似乎这种类型在设计上是 GDK 私有的(仅提供了前向声明)。来自GDK4 documentation

GdkSurface struct 仅包含私有字段,不应 可以直接访问。

请参阅here 以了解定义它的标头(未分发)。这就是你得到这些错误的原因,你所拥有的只是一个传递指针和引用的前向声明。禁止所有对数据成员的访问。

要解决这个问题,您必须使用在表面(公共)上工作的函数,例如 gdk_surface_get_scale_factor 或类似的东西,而不是尝试直接访问数据成员。

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 2013-01-14
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2014-01-28
    相关资源
    最近更新 更多