1

OS = Linux (Fuduntu 2013.2)

プログラムで GList を使用しようとしていますが、g_list_append を呼び出すと、このエラーが発生します

error: invalid conversion from ‘const void*’ to ‘gpointer {aka void*}’ [-fpermissive]
In file included from /usr/include/glib-2.0/glib/ghash.h:35:0,
             from /usr/include/glib-2.0/glib.h:52,
             from /usr/include/glib-2.0/gobject/gbinding.h:30,
             from /usr/include/glib-2.0/glib-object.h:25,
             from /usr/include/glib-2.0/gio/gioenums.h:30,
             from /usr/include/glib-2.0/gio/giotypes.h:30,
             from /usr/include/glib-2.0/gio/gio.h:28,
             from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
             from /usr/include/gtk-2.0/gdk/gdk.h:32,
             from /usr/include/gtk-2.0/gtk/gtk.h:32,
             from main.cpp:4:
/usr/include/glib-2.0/glib/glist.h:61:10: error:   initializing argument 2 of ‘GList* g_list_append(GList*, gpointer)’ [-fpermissive]

これは、g_list_append を含むコード ウィッチの一部です。

#include<iostream>
#include <stdio.h>
#include<gtk/gtk.h>
#include<glibmm.h>

int main(){

    GList *glist_forleg = NULL;
    glist_forleg = g_list_append(glist_forleg, "A1");

    return 0;
}

でコンパイル

g++ -o kabel main.cpp strukt.cpp -lm -Wall `pkg-config  --cflags  --libs  glibmm-2.4` `pkg-config --cflags --libs gtk+-2.0`
4

1 に答える 1

2

これは GLib の問題ではありません (ただし、C バージョンではなく C++ クラスを使用する必要があります)。むしろ、引用符で囲まれた文字列がconst. 使用しようとしている関数は、エラーが伝えようとしているvoid *ポインターではなくポインターを取ります。const void *

固定例を次に示します。

#include <glib.h>

int main(){

    GList *list = NULL;
    list = g_list_append(list, (gpointer)"A1");

    return 0;
}

gpointer...文字列を(aka void *) ではなくにキャストしますconst void *。たとえば、次のようにコンパイルします。

cc -Wall -o test test.c $(pkg-config --cflags --libs glib-2.0)

ただし、文字列が必ずしもメモリ内に留まるとは限らず、ポインターが自分のものではないメモリを指し、メモリ障害を引き起こすため、これは悪い考えです。より良いアイデア (後で解放することを忘れないこと) はg_strdup、メモリ内で文字列を複製するものを使用するか、ライブラリのドキュメントの C++ バージョンで説明されているように、GLibmm が提供する型を使用することです。

于 2013-04-03T18:10:04.520 に答える