Recent

Author Topic: unclear (Duplicate identifier) error  (Read 2324 times)

fcu

  • Jr. Member
  • **
  • Posts: 89
unclear (Duplicate identifier) error
« on: February 22, 2018, 03:21:55 pm »
Hi
try to compile this with fpc 3.0.4 & fpc 3.1.1 , gives this error (Duplicate identifier "tNode$1$crc7ED07D64")
Code: Pascal  [Select][+][-]
  1. {$mode delphi}
  2. type
  3.         tNode<T> = record
  4.           data : T;
  5.           next : ^tNode<T>;
  6.         end;
  7.  
  8.         tLList<T> = object
  9.           procedure add(const item : T);
  10.         private
  11.           head : ^tNode<T>;
  12.         end;
  13.  
  14. procedure tLList<T>.add(const item : T);
  15. var     tmp : ^tNode<T>; // Error: Duplicate identifier "tNode$1$crc7ED07D64"
  16. begin
  17.         //
  18. end;
  19.  
  20. begin
  21. end.
  22.  

am i doing something wrong or its fpc bug ?

ASerge

  • Hero Member
  • *****
  • Posts: 2222
Re: unclear (Duplicate identifier) error
« Reply #1 on: February 22, 2018, 04:48:14 pm »
When mode is objfpc:
Code: Pascal  [Select][+][-]
  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. {$MODE OBJFPC}
  4.  
  5. type
  6.   generic TNode<T> = object
  7.   public type
  8.     PNode = ^TNode;
  9.   public var
  10.     Data: T;
  11.     Next: PNode;
  12.   end;
  13.  
  14.   generic TList<T> = object
  15.   private type
  16.     PNode = specialize TNode<T>.PNode;
  17.   private var
  18.     FHead: PNode;
  19.   public
  20.     constructor Init;
  21.     destructor Done;
  22.     procedure Add(const Item: T);
  23.     procedure PrintAll;
  24.   end;
  25.  
  26. constructor TList.Init;
  27. begin
  28.   FHead := nil;
  29. end;
  30.  
  31. destructor TList.Done;
  32. var
  33.   Prev: PNode;
  34. begin
  35.   while FHead <> nil do
  36.   begin
  37.     Prev := FHead;
  38.     FHead := FHead^.Next;
  39.     Dispose(Prev);
  40.   end;
  41. end;
  42.  
  43. procedure TList.Add(const Item: T);
  44. var
  45.   Tmp: PNode;
  46. begin
  47.   New(Tmp);
  48.   Tmp^.Data := Item;
  49.   Tmp^.Next := FHead;
  50.   FHead := Tmp;
  51. end;
  52.  
  53. procedure TList.PrintAll;
  54. var
  55.   Cur: PNode;
  56. begin
  57.   Cur := FHead;
  58.   while Cur <> nil do
  59.   begin
  60.     Writeln(Cur^.Data);
  61.     Cur := Cur^.Next;
  62.   end;
  63. end;
  64.  
  65. var
  66.   List: specialize TList<Integer>;
  67. begin
  68.   List.Init;
  69.   List.Add(10);
  70.   List.Add(20);
  71.   List.PrintAll;
  72.   List.Done;
  73.   Readln;
  74. end.

fcu

  • Jr. Member
  • **
  • Posts: 89
Re: unclear (Duplicate identifier) error
« Reply #2 on: February 22, 2018, 05:17:28 pm »
thanks ASerge . but my attention was : what is the cause of this error
just curious , why ( head : ^tNode<T>; ) was allowed inside tLList class and not in the (add ) procedure  ?

ASerge

  • Hero Member
  • *****
  • Posts: 2222
Re: unclear (Duplicate identifier) error
« Reply #3 on: February 22, 2018, 05:41:37 pm »
thanks ASerge . but my attention was : what is the cause of this error
just curious , why ( head : ^tNode<T>; ) was allowed inside tLList class and not in the (add ) procedure  ?
An example for both modes, where it is clearly visible that the types of pointers are different!
Code: Pascal  [Select][+][-]
  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. {-$MODE DELPHI}
  4. {$MODE OBJFPC}
  5.  
  6. type
  7.   {$IFDEF FPC_OBJFPC}generic{$ENDIF}TNode<T> = object
  8.   public type
  9.     PItemNode = ^TNode{$IFDEF FPC_DELPHI}<T>{$ENDIF};
  10.   public var
  11.     Data: T;
  12.     Next: PItemNode;
  13.   end;
  14.  
  15.   {$IFDEF FPC_OBJFPC}generic{$ENDIF}TList<T> = object
  16.   private type
  17.     PListNode = {$IFDEF FPC_OBJFPC}specialize{$ENDIF}TNode<T>.PItemNode;
  18.   private var
  19.     FHead: PListNode;
  20.   public
  21.     constructor Init;
  22.     destructor Done;
  23.     procedure Add(const Item: T);
  24.     procedure PrintAll;
  25.   end;
  26.  
  27. constructor TList{$IFDEF FPC_DELPHI}<T>{$ENDIF}.Init;
  28. begin
  29.   FHead := nil;
  30. end;
  31.  
  32. destructor TList{$IFDEF FPC_DELPHI}<T>{$ENDIF}.Done;
  33. var
  34.   Prev: PListNode;
  35. begin
  36.   while FHead <> nil do
  37.   begin
  38.     Prev := FHead;
  39.     FHead := FHead^.Next;
  40.     Dispose(Prev);
  41.   end;
  42. end;
  43.  
  44. procedure TList{$IFDEF FPC_DELPHI}<T>{$ENDIF}.Add(const Item: T);
  45. var
  46.   Tmp: PListNode;
  47. begin
  48.   New(Tmp);
  49.   Tmp^.Data := Item;
  50.   Tmp^.Next := FHead;
  51.   FHead := Tmp;
  52. end;
  53.  
  54. procedure TList{$IFDEF FPC_DELPHI}<T>{$ENDIF}.PrintAll;
  55. var
  56.   Cur: PListNode;
  57. begin
  58.   Cur := FHead;
  59.   while Cur <> nil do
  60.   begin
  61.     Writeln(Cur^.Data);
  62.     Cur := Cur^.Next;
  63.   end;
  64. end;
  65.  
  66. var
  67.   List: {$IFDEF FPC_OBJFPC}specialize{$ENDIF}TList<Integer>;
  68. begin
  69.   List.Init;
  70.   List.Add(10);
  71.   List.Add(20);
  72.   List.PrintAll;
  73.   List.Done;
  74.   Readln;
  75. end.

Those, when it is written ^TNode<T> the compiler does not understand what to choose.

 

TinyPortal © 2005-2018