From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,dfdb3e9be36e818e X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII Received: by 10.68.35.68 with SMTP id f4mr18901987pbj.5.1321903514841; Mon, 21 Nov 2011 11:25:14 -0800 (PST) Path: lh20ni2549pbb.0!nntp.google.com!news1.google.com!postnews.google.com!h30g2000pro.googlegroups.com!not-for-mail From: Adam Beneschan Newsgroups: comp.lang.ada Subject: Re: type access Parent'Class Date: Mon, 21 Nov 2011 11:25:14 -0800 (PST) Organization: http://groups.google.com Message-ID: References: <7fd768a4-f97b-4045-8bab-49d2a3897a61@p2g2000vbj.googlegroups.com> NNTP-Posting-Host: 66.126.103.122 Mime-Version: 1.0 X-Trace: posting.google.com 1321903514 1849 127.0.0.1 (21 Nov 2011 19:25:14 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Mon, 21 Nov 2011 19:25:14 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: h30g2000pro.googlegroups.com; posting-host=66.126.103.122; posting-account=duW0ogkAAABjRdnxgLGXDfna0Gc6XqmQ User-Agent: G2/1.0 X-Google-Web-Client: true X-Google-Header-Order: ARLUEHNKC X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C),gzip(gfe) Xref: news1.google.com comp.lang.ada:18996 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Date: 2011-11-21T11:25:14-08:00 List-Id: On Nov 21, 11:03=A0am, Yukicanis wrote: > Dear Group, > > I'm new to Ada and currently playing around with its OOP features. > Now, I have the following source: > > procedure Test is > =A0 type Parent is tagged limited null record; > =A0 type Parent_Access is access Parent'Class; > =A0 A : access Parent'Class; > =A0 B : Parent_Access; > =A0 procedure Dyn_Disp(X : access Parent'Class) is > =A0 begin > =A0 =A0 A :=3D X; > =A0 =A0 B :=3D X; > =A0 end Dyn_Disp; > begin > =A0 null; > end Test; > > When I try to complie that with GNAT 4.6.1 I get the following error > message: > > test.adb:9:10: expected type "Parent_Access" defined at line 3 > test.adb:9:10: found type access to "Parent'Class" defined at line 6 > > which I don't really understand since type "Parent_Access" is type > access to Parent'Class, isn't it? > > Thanks in advance. Ada is a strongly typed language. That means that you can have two types that look exactly the same but are still different types, because you've declared them as different types, and you can't just use them interchangeably. Example: type Acc_Type_1 is access all Integer; type Acc_Type_2 is access all Integer; V1 : Acc_Type_1; V2 : Acc_Type_2; V1 :=3D V2; -- ILLEGAL! This is illegal because V1 and V2 have different types, even though the types look the same. You have to use a type conversion: V1 :=3D Acc_Type_1(V2); -- LEGAL This doesn't have anything to do with access types, by the way. All types in Ada are like that. In your original example, "access Parent'Class" is an anonymous type, and every time an anonymous type occurs, it's a new type. So that's why B :=3D X; is illegal. You have to use a type conversion: B :=3D Parent_Access(X); That still won't quite work, because anonymous access types are "general" access types and their values can point to any aliased Parent'Class object. However, Parent_Access is called a "pool- specific" access type because it can only point to objects that are allocated with "new". To make Parent_Access a general access type, add an "all": type Parent_Access is access all Parent'Class; and now your example will compile. In my view, there isn't much reason *not* to use "all" in an access type declaration, and I've gotten in the habit of including it routinely. (But you can't use "all" like this if it's not in a TYPE declaration.) The language allows A :=3D X; even though A and X have different types, because there's no way to write a type conversion. This is an exception to the strong-typing rules. Hope this helps, -- Adam