Вала синтаксис для делегатов? - PullRequest
0 голосов
/ 29 ноября 2011

сначала, некоторые определения из /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' to Archive.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 for OpenCallback'

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

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

1 Ответ

1 голос
/ 30 ноября 2011

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

...