Debugging Ada“=”运算符重载错误

Debugging Ada“=”运算符重载错误,debugging,operator-overloading,syntax-error,ada,Debugging,Operator Overloading,Syntax Error,Ada,我是ADA编程语言的新手,这是我使用这种语言遇到的第一个问题 我试图重载operator=但编译器给了我这个错误:没有适用于私有类型队列的operator= 嗯,但我想我写得很好 请看。广告: generic type Value is private; type Key is private; with function "+"(x,y:Value) return Value is <>; package Queue is type Rek is record V

我是ADA编程语言的新手,这是我使用这种语言遇到的第一个问题

我试图重载operator=但编译器给了我这个错误:没有适用于私有类型队列的operator=

嗯,但我想我写得很好

请看。广告:

generic
type Value is private;
type Key is private;
with function "+"(x,y:Value) return Value is <>;   
package Queue is
   type Rek is record
   V:Value;
   K:Key;
   end record;
subtype Elem is Rek;


  type Queue( Max: Positive ) is limited private;

  procedure Add( b: in out Queue; k: in Key; v:in Value );
  procedure Get( b: in Queue; k: in Key; v: out Value; found: out Boolean );
  procedure Erase(m: in out Queue; k : in Key);
  function "="(mleft: in Queue; mright : in Queue) return Boolean;
  function Has_Key( m: Queue ; k:Key) return Boolean;

private

  type Tömb is array ( Integer range <> ) of Elem;
  type Queue( Max: Positive ) is record
                                   Adatok: Tömb(1..Max);
                                   Putter, Getter: Positive := 1;
                                   Size: Natural := 0;
                               end record;

end Queue;
而主叫=:

 procedure demmo is
 mer: constant Integer :=10;  
 package Newq is new Queue(Integer,Integer);

 s1:Newq.Queue(5);
 s2:Newq.Queue(5);
 begin
 Newq.Add(s1,1,5);
 Newq.Add(s2,1,5);
 if s1=s2 then PUT_LINE("Egyenloek");
 else PUT_LINE("Nem egyenloek");
 end if;
 end demmo;
如果希望直接看到类型的concrete=运算符,则必须使其可见。为此,您需要使用或使用类型或使用所有类型

参考资料


使用Newq类型;在实例化包之后,Newq应该使其原语操作可见。否则,访问函数的方法是:如果Newq.=s1,s2,那么…@BrianDrummond,但是在哪里写入使用类型Newq?它给了我更多的错误…子类型掩码是必需的整个主文件?如果是这样,您将丢失一个带有队列的队列;在demmo程序之前is@egilhh不,这不是全部……我用queue写的。它应该是使用newq.queue类型;就在包newq之后是。。。;
 procedure demmo is
 mer: constant Integer :=10;  
 package Newq is new Queue(Integer,Integer);

 s1:Newq.Queue(5);
 s2:Newq.Queue(5);
 begin
 Newq.Add(s1,1,5);
 Newq.Add(s2,1,5);
 if s1=s2 then PUT_LINE("Egyenloek");
 else PUT_LINE("Nem egyenloek");
 end if;
 end demmo;
package Newq is new Queue(Integer,Integer);
use type newq.Queue;