How to remove :TPRGED] Type name 'driver#(NO_OF_DEVICE)' already registered with factory

In reply to dave_59:

`define param_value
parameter value= `param_value

class driver1#(int W = 1 ) extends uvm_component;
   `uvm_component_utils(driver1#(W))
   function new ( string name = "driver1" ,  uvm_component p = null);
     super.new(name, p);
   endfunction
   function void build_phase(uvm_phase phase);
    ..... some statements .....
   endfunction

 task reset_phase(uvm_phase phase);
   
  endtask : reset_phase
  task main_phase(uvm_phase phase);
  ......... some statements .....
  endtask : main_phase
endclass

class driver2#(int W= 0) extends driver1;
   `uvm_component_utils(driver2#(W))
   function new ( string name = "driver2" , uvm_component p = null);
     super.new(name, p);
   endfunction
   function void build_phase(uvm_phase phase);
    ...... some statements .....
   endfunction

 task reset_phase(uvm_phase phase);
   
  endtask : reset_phase
  task main_phase(uvm_phase phase);
  ......... some statements .....
  endtask : main_phase
endclass
 
class agent#(int W= 0) extends uvm_agent;
  `uvm_component_utils(agent#(W))
   driver1#(value) c3;
  function new ( string name ="agent", uvm_component p = null);
    super.new(name, p);
  endfunction
  virtual function void build_phase(uvm_phase phase);
    c3 = driver1#(value)::type_id::create("c3", this);
  endfunction
endclass

class env#(int W= 0) extends uvm_env;
  `uvm_component_utils(env#(W))
   agent#(value) a;
  function new ( string name ="env", uvm_component p = null);
    super.new(name, p);
  endfunction
  virtual function void build_phase(uvm_phase phase);
    a = agent#(value)::type_id::create("a", this);
  endfunction
endclass

class base_test extends uvm_test;
  `uvm_component_utils(base_test)
   env e;
  
  function new  ( string name = "test", uvm_component p = null);
    super.new(name, p);
  endfunction
  virtual function void build_phase(uvm_phase phase);
   e = env#(value)::type_id::create("e", this);
 endfunction
endclass

class test extends base_test;
  `uvm_component_utils(test)

  function new  ( string name = "test", uvm_component p = null);
    super.new(name, p);
  endfunction
  virtual function void build_phase(uvm_phase phase);
   set_type_override_by_type( driver1#()::get_type(), driver2#()::get_type()); 
   super.build_phase(phase); 
  endfunction
endclass

module top;
initial begin
   run_test("test");
end
endmodule  


I am passing param_value from command line.
if i am using uvm_component_param_utils driver2 is not overiding driver1. But if i use uvm_component_utils it working but the warning comes.