无效的指针作为vala中的返回值



想象我们有这样的东西(这只是一个例子(

public interface Foo : GLib.Object {
    public abstract double *f();
}
public class Toto : GLib.Object, Foo {
    private double i;
    public Toto(double i = 0) {
        this.i = i;
    }
    public double *f() {
        return &i;
    }
    public static int main(string[] args) {
        Foo a = new Toto(42.0);
        double i = *a.f();
        stdout.printf("%.3fn", i);
        return 0;
    }
}

此代码工作正常,但是问题是Foo必须使用public abstract T *f()通用,因此Toto必须实现Foo<double>,但是

`double'不是受支持的通用类型参数

(我的第一个问题是"为什么?",据我所知,例如我可以使用int而没有任何问题(

所以它是 Foo<double?>,我需要诸如 double i = (!) *(a.f())之类的东西,但是它只是不起作用(在C级(

错误:无效使用void表达式 i = (gdouble) (*(*_tmp1_));

那么如何使用f()方法?

(我的vala版本是0.36.3(

为什么首先在vala中使用指针?(这是灰心的,指针是针对角落案例的语言。(

vala中的无效类型是生成的C代码中的指针。

因此,解决此问题的一种方法是:

public interface Foo<T> : GLib.Object {
    public abstract T f();
}
public class Toto : GLib.Object, Foo<double?> {
    private double i;
    public Toto(double i = 0) {
        this.i = i;
    }
    public double? f() {
        return i;
    }
    public static int main(string[] args) {
        Foo<double?> a = new Toto(42.0);
        double? i = a.f();
        stdout.printf("%.3fn", (!) i);
        return 0;
    }
}

这与Valac 0.36.3在此处编译并完美地工作。

Toto.f生成的C函数的类型签名是:

static gdouble* toto_real_f (Foo* base);

相关内容

  • 没有找到相关文章

最新更新