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,bb8516c9e7650bc8,start X-Google-Attributes: gid103376,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news3.google.com!feeder1-2.proxad.net!proxad.net!feeder1-1.proxad.net!club-internet.fr!feedme-small.clubint.net!aioe.org!not-for-mail From: Dennis Hoppe Newsgroups: comp.lang.ada Subject: Passing an instance of a generic child as a generic parameter Date: Sat, 14 Jun 2008 22:54:46 +0200 Organization: Aioe.org NNTP Server Message-ID: NNTP-Posting-Host: /oyfqnpDnFLd1oxvmQvR4w.user.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) Xref: g2news1.google.com comp.lang.ada:706 Date: 2008-06-14T22:54:46+02:00 List-Id: Hi there, I'm trying to pass an instance of a generic child unit to another generic package, but the only syntax, I could found specifies a concrete generic package. Let's first have a look at my pathological example: -- GENERIC PARENT 'other' ADS generic B : Integer; package Other is type Object is tagged null record; procedure Solve (Obj : Object); end Other; -- GENERIC PARENT 'other' ADB with Ada.Text_IO; package body Other is procedure Solve (Obj : Object) is begin Ada.Text_IO.Put_Line ("solved"); end; end Other; -- GENERIC CHILD of 'other' ADS with Other; generic -- omitted package Other.Child is type Instance is new Other.Object with null record; overriding procedure Solve (Obj : in Instance); end Other.Child; -- GENERIC CHILD of 'other' ADB with Ada.Text_IO; package body Other.Child is procedure Solve (Obj : in Instance) is begin Ada.Text_IO.Put ("other child"); end; end Other.Child; -- GENERIC PARENT 'parent' ADS with Other; generic A: Integer; with package XX is new Other (A); parent Parent is type Object is abstract tagged null record; procedure Print (Obj: in Object; X : in XX.Object'Class); end Parent; -- GENERIC PARENT 'parent' ADB with Ada.Text_IO; package body Parent is procedure Print (Obj : in Object; X : in XX.Object'Class) is begin X.Solve; Ada.Text_IO.Put (Integer'Image(A)); end; end Parent; -- GENERIC CHILD of 'parent' ADS with Parent; generic -- omitted package Parent.Child is type Instance is new Parent.Object with null record; overriding procedure Print (Obj : in Instance; X : in XX.Object'Class); end Parent.Child; -- GENERIC CHILD of 'parent' ADB with Ada.Text_IO; package body Parent.Child is procedure Print (Obj : in Instance; X : in XX.Object'Class) is begin Ada.Text_IO.Put_Line ("child"); X.Solve; end; end Parent.Child; -- TESTSUITE with Parent; with Other; with Other.Child; procedure Test is A : Integer := 2; package O is new Other (A); package E is new O.Child; package P is new Parent (A, O); procedure Calls (Obj : P.Object'Class; X : in O.Object'Class) is begin -- Calls P.Print (Obj, X); end Calls; X : C.Instance; OO : O.Object; EE : E.Instance; begin -- Test Calls (X, OO); end Test; Ok, if I declare 'package P is new Parent (A, O);' and call the Calls procedure with 'Calls (X, OO);' all went fine, because O is an instance of Other. I want further to declare my package P with a child unit of Other, so that: procedure Test is A : Integer := 2; package O is new Other (A); package E is new O.Child; package P is new Parent (A, E); -- O is replaced by the child E .. -- compiler error expected end Test; Is it possible to declare a generic package parameter to accept children, too? Or should I better solve this challenge with another approach? generic A: Integer; with package XX is new Other (A); .. ... won't do it. Thanks in advance, Dennis