Ada 如何从泛型包实例化记录

Ada 如何从泛型包实例化记录,ada,Ada,我是Ada的新手,有一些问题。我创建了一个通用日期包: Date.ads: GENERIC PACKAGE Date IS TYPE MonthName IS (January, February, March, April, May, June, July, August, September, October, November, December); TYPE DateRec IS RECORD Month: MonthName; Day: Integer

我是Ada的新手,有一些问题。我创建了一个通用日期包:

Date.ads:

GENERIC

PACKAGE Date IS
  TYPE MonthName IS (January, February, March, April, May, June, July, August,
   September, October, November, December);

  TYPE DateRec IS RECORD
    Month: MonthName;
    Day: Integer RANGE 1..31;
    Year: Integer;
  END RECORD;

  PROCEDURE PrintDate(Adate: IN DateRec);
END Date;
日期:adb:

WITH Ada.Text_IO;
USE Ada.Text_IO;

PACKAGE BODY Date  IS

PACKAGE MonthNameIO IS NEW Ada.Text_IO.Enumeration_IO(MonthName);
USE MonthNameIO;

PACKAGE IntegerIO IS NEW Ada.Text_IO.Enumeration_IO(Integer);
USE IntegerIO;

PROCEDURE PrintDate(Adate: IN DateRec) IS
  BEGIN
    Put(Adate.Month);
    Put(Adate.Day,3);
    Put(",");
    Put(Adate.Year, 5);
    New_Line;
  END PrintDate;
END Date;
我希望能够在程序中使用“DateRec”,但在尝试编译时会遇到错误。呼叫代码:

WITH Date;
...
PACKAGE Date_Stack IS NEW Gstack(StackSize, DateRec);
我在编译时遇到以下错误:

genstack.adb:176:57: "DateRec" is not visible (more references follow)
genstack.adb:176:57: non-visible declaration at date.ads:7
我错过了什么

好的,现在我遇到的问题是当我尝试使用一个对象时:

TempDate: Date.DateRec;
...
Get(TempDate.Month);
现在,编译给了我:

genstack.adb:201:25: missing argument for parameter "Item" in call to "Get" declared at a-tienio.ads:65, instance at line 183             

您的
Date
包没有通用参数,因此可能没有必要将其设置为通用参数

如果您删除
GENERIC
关键字,它可能会起作用(我自己还没有尝试过)

如果您确实希望它是泛型的,那么您需要在使用它之前实例化它<代码>日期不是一个包;这是一个通用的软件包

 generic
 package Date is
 ...
 end Date;

 package MyDate is new Date;
现在
MyDate
是一个(非通用)包,您可以参考
MyDate.DateRec

通过使其不带泛型参数,可以创建多个实例化,每个实例化都是一个不同的包,因此
MyDate.DateRec
YourDate.DateRec
是不同的类型。不清楚这是否值得


通常,泛型包有一个或多个参数,因此不同的实例在不同的类型上运行。你的代码中甚至有这样的例子:
Ada.Text\u IO.Enumeration\u IO
是泛型的,你的
MonthNameIO
是泛型包的一个具体实例。

语言是“Ada”,而不是“Ada”(它是一个名称,不是首字母缩写)。你在
Date.adb
中的缩进是关闭的;从<代码>包装月…到<代码>程序打印日期的所有内容都应再缩进一级。另外,Ada代码的现代惯例是用小写字母而不是大写字母(这是Ada参考手册中使用的惯例)。关于编辑:你应该问一个新问题。事实上,我怀疑在错误发生的地方没有类似的
MonthNameIO
;您已经在日期主体中完成了实例化。也许你可以把它移到规范的可见部分。正如@SimonWright所说,这是一个新问题,与原来的问题无关。第183行是否指您的
MonthNameIO
?调用
Get(TempDate.Month)看起来正确。如果你需要帮助,把你的代码缩小到一个简单的例子来演示这个问题(不是原来的问题),然后在一个新的问题中发布它
MonthNameIO.Get
仅在
Date
主体内可见,而不在其外部可见,因为它是在
Date
主体中声明的。产生令人困惑的错误消息的原因可能是存在其他可见的
Get
[s],可能来自
Enumeration\u IO
的另一个实例,并且编译器正试图使您的调用符合其他
Get
[s]的声明。谢谢,这解决了我的第一个问题。现在,我有了一个处理Get()的新函数。我已经用更多的细节更新了原来的帖子。
 generic
 package Date is
 ...
 end Date;

 package MyDate is new Date;