gpt4 book ai didi

operator-overloading - haxe 运算符重载 ==,找不到模板参数的类错误

转载 作者:行者123 更新时间:2023-12-01 10:50:56 24 4
gpt4 key购买 nike

我正在尝试在自定义“对”类型上重载等号 (==) 运算符,如下所示:

private typedef Data<A, B> = { a: A, b: B } 

abstract Pair<A, B>(Data<A, B>) {
public var a(get, set):A;
public var b(get, set):B;

public function equals1(lhs:Pair<A,B>, rhs:Pair<A,B>):Bool {
return (lhs.a == rhs.a && lhs.b == rhs.b);
}

@:op(X == Y) static public function equals(lhs:Pair<A,B>, rhs:Pair<A,B>):Bool {
return (lhs.a == rhs.a && lhs.b == rhs.b);
}

public inline function new(a:A, b:B) this =
{ a: a, b: b };
inline function get_a():A
return this.a;

inline function get_b():B
return this.b;

inline function set_a(v:A):A
return this.a = v;

inline function set_b(v:B):B
return this.b = v;

}

我是抽象类和运算符重载的新手。但是重载部分几乎是从 haxe 文档示例中逐字复制的。重载运算符旨在测试两对是否相等。但是,当我将代码编译为 neko 时,出现错误:

Pair.hx:11: lines 11-13 : Class not found : A

我在这里很困惑,因为正如您在重载函数上方看到的那样,有一个普通函数版本“equals1”,它编译得很好。一旦我添加@:op(X == Y),Pair 中的模板参数 A 就“找不到”。

我的问题是如何使这个重载工作,以及我的代码中出了什么问题?

提前致谢。

附言我正在使用安装在 Windows 上的 Haxe Compiler 3.0.1。

--更新--:我再次查看了代码,似乎是将 equals 函数声明为“static”导致了问题。如果我将“static”添加到普通函数,

static public function equals1(lhs:Pair<A,B>, rhs:Pair<A,B>):Bool { 
...

同样报错

--更新--:back2dos 的回答是正确的:

private typedef Data<A, B> = { a: A, b: B } 

abstract Pair<A, B>(Data<A, B>) {
public var a(get, set):A;
public var b(get, set):B;

public function equals1(lhs:Pair<A,B>, rhs:Pair<A,B>):Bool {
return (lhs.a == rhs.a && lhs.b == rhs.b);
}

@:op(X == Y) static public function equals<A, B>(lhs:Pair<A,B>, rhs:Pair<A,B>):Bool {
return (lhs.a == rhs.a && lhs.b == rhs.b);
}

public inline function new(a:A, b:B) this =
{ a: a, b: b };
inline function get_a():A
return this.a;

inline function get_b():B
return this.b;

inline function set_a(v:A):A
return this.a = v;

inline function set_b(v:B):B
return this.b = v;

}

class Main {
static public function main() {
var p1 = new Pair(1,2), p2 = new Pair(1,5);
trace (p1 == p2);

}
}

输出:Main.hx:34: 错误Main.hx:35: 真

最佳答案

这里的问题是在类/抽象上声明的类型参数的范围是实例/值,因此没有在静态上下文中定义。

因此,您需要对函数进行参数化:


@:op(X == Y) static public function equals1<A, B>(lhs:Pair<A,B>, rhs:Pair<A,B>):Bool;

关于operator-overloading - haxe 运算符重载 ==,找不到模板参数的类错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com