来自Ada的"操作符号不允许通用子程序"

0 operator-overloading ada

我想制作用Ada添加数组元素的子程序.子程序"Add_Data"有3个参数 - 第一个参数=泛型类型数组(INTEGER数组或REAL数组)第二个参数= INTEGER(数组大小)第三个参数=泛型类型sum(INTEGER数组 - > sum将是INTEGER,数组真实 - >总和将是真实的)

我是从ideone.com编程的.(我想通过INTEGER数组看到结果.之后,我将通过REAL数组进行测试)

With Ada.Text_IO; Use Ada.Text_IO;  
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
procedure test is
   generic 
      type T is private;
      type Tarr is array (INTEGER range <>) of T;
      --function "+" (A,B : T) return T;
      --function "+" (A, B : T) return T is
      --begin
      --   return (A+B);
      --end "+";
   procedure Add_Data(X : in Tarr; Y : in INTEGER; Z : in out T);

   procedure Add_Data(X : in Tarr; Y : in INTEGER; Z : in out T) is
      temp : T;
      count : INTEGER;
   begin
      count := 1;
      loop
         temp :=temp+  X(count);    //<-This is problem.
         count := count + 1;
         if count > Y then
            exit;
         end if;
      end loop;
      Z:=temp;
   end Add_Data;

   type intArray is array (INTEGER range <>) of INTEGER;
   intArr : intArray := (1=>2, 2=>10, 3=>20, 4=>30, 5=>8);
   sum : INTEGER;
   procedure intAdd is new Add_Data(Tarr=>intArray, T=>INTEGER);

begin
   sum := 0;
   intAdd(intArr, 5, sum);
   put (sum);
end test;
Run Code Online (Sandbox Code Playgroud)

当我不重载运算符"+"时,它会产生错误."对于私人类型"T",没有适用的运营商"+"." 我能为此做些什么?

Sim*_*ght 7

如果泛型的形式类型是private,那么泛型中的任何内容都不能假定关于该类型的任何内容,除了它可以被赋值(:=)并且可以比较equality(=)和inequality(/=).特别是,+除非您提供,否则通用中没有其他操作员(例如)可用.

这样做的方法是

generic 
   type T is private;
   with function "+" (L, R : T) return T is <>;
Run Code Online (Sandbox Code Playgroud)

这告诉编译器(a)有一个函数"+"需要两个T并返回一个T; (b)如果实际T拥有"+"与该配置文件匹配的运营商,则允许其作为默认值.

所以,你可以说

procedure intAdd is new Add_Data (T => Integer, ...
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用默认值,

procedure intAdd is new Add_Data (T => Integer, "+" => "+", ...
Run Code Online (Sandbox Code Playgroud)