我正在尝试使用Gobo编译器及其工具编译项目(请参阅this SO question),并且我收到了引用标准库equal(..)
的错误消息。我确定错误在我所拥有的代码中,而不是在标准库中,但我不知道如何从geant
获取更多信息。我想知道我的代码调用了哪个类,函数,代码行equal(..)
或任何其他可能调用它的标准库函数。是的,我已经尝试在我的代码中浏览所有equal(..)
。
我得到的错误信息是这样的:
[CATCALL] class SQL_GENERATOR_TSQL65(ANY,95,8):type' STRING_8'实际参数#1不符合类型' UC_STRING'功能`is_equal'中的正式论证在班级' UC_STRING'
这指向library\free_elks\src\elks\kernel\any.e
:
frozen equal (a: detachable ANY; b: like a): BOOLEAN
-- Are `a' and `b' either both void or attached
-- to objects considered equal?
do
if a = Void then
Result := b = Void
else
Result := b /= Void and then
a.is_equal (b) -- <<<<<<< THIS LINE
end
ensure
definition: Result = (a = Void and b = Void) or else
((a /= Void and b /= Void) and then
a.is_equal (b))
end
答案 0 :(得分:1)
报告的CAT呼叫是系统错误(与类错误相反),即作为整个系统分析的结果出现。课程UC_STRING
重新定义了要素is_equal
。因此,它只能用于UC_STRING
类型(或其后代)的参数。
有些代码将UC_STRING
视为STRING_8
(UC_STRING
继承自STRING_8
)。只要UC_STRING
附加到STRING_8
类型的实体,代码就有可能获得CAT呼叫。这是一个例子:
s: STRING_8
t: STRING_8
u: UC_STRING
...
s := u
if equal (s, t) then ...
equal
的代码,您在is_equal
的实例上提及调用UC_STRING
,但接收STRING_8
作为参数。但是,is_equal
中UC_STRING
的版本只能处理UC_STRING
作为参数,而不是STRING_8
。这就是你收到错误的原因。
问题可以通过
解决is_equal
中UC_STRING
的参数类型以接受STRING_8
UC_STRING
至STRING_8
在你的情况下,最后一个似乎是最好的。