什么是"在此上下文中需要的子类型标记"究竟?

时间:2015-02-17 00:35:57

标签: ada

我在Subtype mark required in this context获得(*)。什么是亚型面具,为什么在这里抱怨?

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;

2 个答案:

答案 0 :(得分:4)

subtype_mark 基本上是一个表示类型或子类型(ARM 3.2.2(4))的名称。 ARM始终使用 subtype_mark 的原因是与某些神秘的区别(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

(看看它是如何告诉你查看location.ads第1行的包名?)

可以通过说new Location.Location来解决这个问题,但是你需要在任何地方说出来。

有两种规范的解决方案,两个阵营的支持者之间存在宗教分歧。

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

第二个(认为丑陋而且只会急需使用)将用后缀装饰类型名称:

type Location_Type is

type Location_T is

答案 1 :(得分:0)

问题中提供的源代码不完整(您没有说明使用 d还是仅 编辑位置包我假设后者(至少在我安装的编译器中)给出的错误信息是无效约束:类型没有判别

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

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