"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
并保留类型 Location
、Route
、Population
。
第二种(我认为丑陋,只会在迫切需要时使用)是用后缀修饰类型名称:
type Location_Type is
或
type Location_T is
问题中给出的源代码不完整(您没有说明您是 使用 d 还是仅 withed Location 包。我假设是后者,因为(至少对于我安装的编译器)给出的错误消息是 无效约束:类型没有判别式 。
@ajb 已经指出了该问题的解决方案:没有引号,编译器会寻找具有判别式的类型(由另一种类型参数化的类型),但 Location 没有判别式。
此外,除非您使用d Location 包,否则 new Location
实际上不是指类型(或子类型),而是指 包裹。如果您不想 使用 位置,请输入
new Location.Location'(…
这里。避免此类错误(并获得更好的错误消息)的一种方法是对包和类型使用不同的名称:当两者具有相同的名称时,并不总是直观地清楚编译器如何解释名称的出现,以及意见何时出现编译器和程序员的不同,随之而来的是混乱。
就个人而言,我喜欢用复数表示包,所以在这种情况下,会有一个包含类型 Location 的包 Locations,但是还有其他的可能性。
我在 (*)
得到 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
并保留类型 Location
、Route
、Population
。
第二种(我认为丑陋,只会在迫切需要时使用)是用后缀修饰类型名称:
type Location_Type is
或
type Location_T is
问题中给出的源代码不完整(您没有说明您是 使用 d 还是仅 withed Location 包。我假设是后者,因为(至少对于我安装的编译器)给出的错误消息是 无效约束:类型没有判别式 。
@ajb 已经指出了该问题的解决方案:没有引号,编译器会寻找具有判别式的类型(由另一种类型参数化的类型),但 Location 没有判别式。
此外,除非您使用d Location 包,否则 new Location
实际上不是指类型(或子类型),而是指 包裹。如果您不想 使用 位置,请输入
new Location.Location'(…
这里。避免此类错误(并获得更好的错误消息)的一种方法是对包和类型使用不同的名称:当两者具有相同的名称时,并不总是直观地清楚编译器如何解释名称的出现,以及意见何时出现编译器和程序员的不同,随之而来的是混乱。
就个人而言,我喜欢用复数表示包,所以在这种情况下,会有一个包含类型 Location 的包 Locations,但是还有其他的可能性。