"Subtype mark required in this context" 到底是什么?

What is "Subtype mark required in this context" exactly?

我在 (*) 得到 Subtype mark required in this context。 subtype mask 到底是什么,为什么在这里抱怨?

main.adb

(*)Open_Route : Route(1..3) := (others => new Location(X=>1.0,Y=>1.0, id=>1));
--     Closed_Route : Route (Open_Route'First .. Open_Route'Last + 1);
--     P1 : Population (1..2);

Location.ads 包规格

    type Location is record
      Id : Positive;
      X : Float;
      Y : Float;
   end record;
   type Location_Acess is access all Location; 
   type Route is array (Positive range<>) of Location_Acess; 
   type Route_Acess is access all Route;
   type Population is array (Positive range<>) of Route_Acess;

A subtype_mark 基本上是一个表示类型或子类型的名称 (ARM 3.2.2(4)). The reason why the ARM uses subtype_mark throughout is to do with some arcane distinction (ARM 3.2.1);当您说 type Foo is 时,您同时声明了一个类型及其 第一个子类型 ,并且名称 Foo 指的是第一个子类型。

我认为你的问题是你有一个包 Location 包含一个同名的实体,这让编译器感到困惑。

您没有提供完整的可编译代码示例,但在应用@ajb 的建议后,从字里行间我认为应该是这样的:

package Location is
   type Location is record
      Id : Positive;
      X : Float;
      Y : Float;
   end record;
   type Location_Acess is access all Location;
   type Route is array (Positive range<>) of Location_Acess;
   type Route_Acess is access all Route;
   type Population is array (Positive range<>) of Route_Acess;
end Location;
with Location; use Location;
package Location_User is
   Open_Route : Route(1..3) := (others => new Location'(X=>1.0,Y=>1.0, id=>1));
end Location_User;

编译器错误消息将是

location_user.ads:3:47: subtype mark required in this context
location_user.ads:3:47: found "Location" declared at location.ads:1

(看看它是怎么告诉你看第 1 行的 location.ads,包名?)

可以 通过说 new Location.Location 来解决这个问题,但是你需要到处都说。

有两个正则解,两个阵营的支持者之间存在宗教分歧。

第一个(我的首选)是调用包 Locations 并保留类型 LocationRoutePopulation

第二种(认为丑陋,只会在迫切需要时使用)是用后缀修饰类型名称:

type Location_Type is

type Location_T is

问题中给出的源代码不完整(您没有说明您是 使用 d 还是仅 withed Location 包。我假设是后者,因为(至少对于我安装的编译器)给出的错误消息是 无效约束:类型没有判别式

@ajb 已经指出了该问题的解决方案:没有引号,编译器会寻找具有判别式的类型(由另一种类型参数化的类型),但 Location 没有判别式。

此外,除非您使用d Location 包,否则 new Location 实际上不是指类型(或子类型),而是指 包裹。如果您不想 使用 位置,请输入 new Location.Location'(… 这里。避免此类错误(并获得更好的错误消息)的一种方法是对包和类型使用不同的名称:当两者具有相同的名称时,并不总是直观地清楚编译器如何解释名称的出现,以及意见何时出现编译器和程序员的不同,随之而来的是混乱。 就个人而言,我喜欢用复数表示包,所以在这种情况下,会有一个包含类型 Location 的包 Locations,但是还有其他的可能性。