gpt4 book ai didi

operator-overloading - Ada Compiler 放弃通过重载运算符的包的实例化

转载 作者:行者123 更新时间:2023-12-04 08:21:13 27 4
gpt4 key购买 nike

我想实例化一个包并向其传递重载运算符的函数,以创建通用二叉搜索树。这是规范。

bstgen.ads(片段)

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Unchecked_Deallocation;

GENERIC
type Akey is private;
type TreeRecord is private;
with function "<"(K: in Akey; R: in TreeRecord) return Boolean;
with function ">"(K: in Akey; R: in TreeRecord) return Boolean;
with function "="(K: in Akey; R: in TreeRecord) return Boolean;

PACKAGE BSTGen IS

TYPE St10 IS NEW String(1..10);
TYPE TreePt IS PRIVATE;
PACKAGE EnumIO IS NEW Ada.Text_IO.Enumeration_IO(Akey); USE EnumIO;

driver.adb(片段)

with Ada.Text_IO; use Ada.Text_IO;
WITH BSTGen;

PROCEDURE Driver IS
IP: Integer := 1;
TYPE Names IS (Resig,Keene,Marsden,Vuijic,Marcus,Gonzalez);
PACKAGE NamesIO IS NEW Ada.Text_IO.Enumeration_IO(Names);
type St10 is NEW String(1..10);
type Customer is
record Name: Names;
PhoneNumber: St10;
end record;
function "<"(K: in Names; R: in Customer) return Boolean is begin
return K < R.Name;
end "<";
function ">"(K: in Names; R: in Customer) return Boolean is begin
return K > R.Name;
end ">";
function "="(K: in Names; R: in Customer) return Boolean is begin
return K = R.Name;
end "=";
PACKAGE IntIO IS NEW Ada.Text_IO.Integer_IO(Integer); USE IntIO;
PACKAGE mybst is NEW BSTGen(Names,Customer,<,>,=); USE mybst;
R, Pt: TreePt;
Name: Names;
Phone: St10;
Status: Boolean;
BEGIN
R := CreateTree;
Pt := R;

但是,当我尝试编译时,这是输出:

driver.adb:24:04: expect subprogram or entry name in instantiation of "<"
driver.adb:24:04: instantiation abandoned
bstgen.ads:19:53: expect discrete type in instantiation of "Enum"
bstgen.ads:19:53: instantiation abandoned

这包括一堆错误,指出 driver.adb 的方法不可见,这是预期的,因为 mybst 的实例化被放弃了。我该如何解决这个问题?

最佳答案

bstgen.ads中,你说

PACKAGE EnumIO IS NEW Ada.Text_IO.Enumeration_IO(Akey);

但是在你所说的通用正式部分

type Akey is private;

这意味着编译器可以对实际类型做出很少的假设,除了相等和赋值是可用的。它可能是数百字节的记录;它当然不必是枚举。

要确保Akey是一个枚举,你需要说

type Akey is (<>);

ARM12.5(13) .

driver.adb中,你说

PACKAGE mybst is NEW BSTGen(Names,Customer,<,>,=);

应该读什么

PACKAGE mybst is NEW BSTGen(Names,Customer,”<“,”>”,”=“);

关于operator-overloading - Ada Compiler 放弃通过重载运算符的包的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33848077/

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