Синтаксис Vala для делегатов?

сначала несколько определений из /usr/share/vala/vapi/libarchive.vapi

[CCode (cprefix="ARCHIVE_", lower_case_cprefix="archive_", cheader_filename = "archive.h")]
namespace Archive {...
[CCode (instance_pos = 1.9, cname="archive_open_callback")]
    public delegate int OpenCallback (Archive archive);
    ...
    [CCode (cname = "struct archive", free_function="archive_write_finish")]
    public class Write : Archive {...
            public Result open (
                    [CCode (delegate_target_pos = 0.9)] OpenCallback ocb,
                    [CCode (delegate_target_pos = 0.9)] WriteCallback rcb,
                    [CCode (delegate_target_pos = 0.9)] CloseCallback ccb
            );
    }
}

тогда мой код

int mOpenCallback (Write archive)
{
    return Result.OK;
}

void foo(){...
Write archive = new Write();
archive.open(mOpenCallback,mWriteCallback,mCloseCallback);
...}

результаты: ошибка: назначение: невозможно преобразовать из mOpenCallback' toArchive.OpenCallback'

что с этим не так ?

тогда я попробовал это вместо этого

namespace Archive {
int OpenCallback (Write archive)
{
    return Result.OK;
}
}

void foo(){...
Write archive = new Write();
archive.open(OpenCallback,mWriteCallback,mCloseCallback);
...}

но выводит: Archive' already contains a definition forOpenCallback'

void foo(){...
Write archive = new Write();
Archive.OpenCallback t = mOpenCallback;
archive.open(t,mWriteCallback,mCloseCallback);
...}

выводит ошибку: Назначение: Невозможно преобразовать из foo.mOpenCallback' toArchive.OpenCallback'


person v1nce    schedule 29.11.2011    source источник


Ответы (1)


mOpenCallback принимает аргумент типа Write, а не Archive, поэтому он имеет тип, отличный от делегата OpenCallback. Если вы ожидаете Write, вы должны выполнить приведение из Archive, чтобы написать внутри вашего обратного вызова.

person apmasell    schedule 29.11.2011
comment
Мой исходный код для обратного вызова был общедоступным int mOpenCallback (Архив архива) {...}, но это не удалось с ошибкой: «Архив» не является типом. Так что я думал, что Архив виртуальный (в .vapi нет ctor для Архива) или что-то в этом роде. На самом деле, похоже, что я должен префикс имени класса (Архив) с пространством имен (Архив тоже). Используя mOpenCallback (архив Archive.Archive) {...}, он работает нормально. Таким образом, проблема была в некоторой степени связана с использованием параметра записи вместо параметра архива. - person v1nce; 30.11.2011