Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delegates 代表的Vala语法?_Delegates_Vala - Fatal编程技术网

Delegates 代表的Vala语法?

Delegates 代表的Vala语法?,delegates,vala,Delegates,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 OpenC

首先是/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'转换为
Archive.OpenCallback'

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

然后我尝试了这个

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

void foo(){...
Write archive = new Write();
archive.open(OpenCallback,mWriteCallback,mCloseCallback);
...}
但它输出:
Archive'已经包含了
OpenCallback'的定义

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

输出错误:赋值:无法从
foo.mOpenCallback'转换为
Archive.OpenCallback'

mOpenCallback
具有类型为
Write
的参数,而不是
Archive
,因此它的类型与委托的
OpenCallback
不同。如果您希望
Write
,则应执行从
Archive
的强制转换,以便在回拨中写入。

我最初的回拨代码是“public int-mOpenCallback(Archive-Archive){…}”,但此操作失败,并出现错误:`Archive'不是一种类型。所以我认为归档是虚拟的(在.vapi中没有用于归档的ctor)或者类似的东西。事实上,看起来我必须在类名(Archive)前面加上名称空间(Archive)。使用mOpenCallback(Archive.Archive Archive){…}它运行良好。因此,问题在某种程度上与使用Write参数而不是归档参数有关。
void foo(){...
Write archive = new Write();
Archive.OpenCallback t = mOpenCallback;
archive.open(t,mWriteCallback,mCloseCallback);
...}