www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Problems instantiating template class

reply Mek101 <anEmailAddress mail.somewhere> writes:
I'm rewriting from C# a small library of mine to practice with D.
I have a class:


  class WeightedRandom(T, W = float) if(isNumeric!W)
  {
	 // Fields
	 private W[T] _pairs;
	 // The total sum of all the weights;
	 private W _probabilities;

          /// Code...
  }


And when I try to instantiate an object in a unittest


  unittest
  {
	 auto wrnd = new WeightedRandom!char();
	 wrnd.normalizeAt(120.55);
  }


Compilation fails with the following error:


  source/utils/weightedRandom.d(25,18): Error: cannot pass type 
char as a function argument
  source/utils/weightedRandom.d(90,18): Error: template instance 
`utils.weightedrandom.WeightedRandom!(char, float)` error 
instantiating
  /usr/bin/dmd failed with exit code 1.


Same exact error with:
    WeightedRandom!(char)();
    WeightedRandom!(string, float)();


It seems like dmd thinks I'm calling a function while I'm trying 
to instantiate the object.
Apr 06
parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Saturday, 6 April 2019 at 17:30:45 UTC, Mek101 wrote:
 I'm rewriting from C# a small library of mine to practice with 
 D.
 I have a class:


  class WeightedRandom(T, W = float) if(isNumeric!W)
  {
 	 // Fields
 	 private W[T] _pairs;
 	 // The total sum of all the weights;
 	 private W _probabilities;

          /// Code...
  }


 And when I try to instantiate an object in a unittest


  unittest
  {
 	 auto wrnd = new WeightedRandom!char();
 	 wrnd.normalizeAt(120.55);
  }


 Compilation fails with the following error:


  source/utils/weightedRandom.d(25,18): Error: cannot pass type 
 char as a function argument
  source/utils/weightedRandom.d(90,18): Error: template instance 
 `utils.weightedrandom.WeightedRandom!(char, float)` error 
 instantiating
  /usr/bin/dmd failed with exit code 1.


 Same exact error with:
    WeightedRandom!(char)();
    WeightedRandom!(string, float)();


 It seems like dmd thinks I'm calling a function while I'm 
 trying to instantiate the object.
Hmm, import std.traits; class WeightedRandom(T, W = float) if(isNumeric!W) { // Fields private W[T] _pairs; // The total sum of all the weights; private W _probabilities; /// Code... } void main() { auto wrnd = new WeightedRandom!char(); } works for me: https://run.dlang.io/is/CjSubj
Apr 06
parent reply Mek101 <anEmailAddress mail.somewhere> writes:
On Saturday, 6 April 2019 at 17:44:25 UTC, Nicholas Wilson wrote:
 Hmm,

 import std.traits;
 class WeightedRandom(T, W = float) if(isNumeric!W)
  {
 	 // Fields
 	 private W[T] _pairs;
 	 // The total sum of all the weights;
 	 private W _probabilities;

          /// Code...
  }

 void main()
 {
     auto wrnd = new WeightedRandom!char();
 }

 works for me: https://run.dlang.io/is/CjSubj
My bad. It seems like an invisible character sent the complier crazy. I re-wrote the unittest and now it works... Weird...
Apr 06
parent Mek101 <anEmailAddress mail.somewhere> writes:
On Saturday, 6 April 2019 at 18:08:31 UTC, Mek101 wrote:
 On Saturday, 6 April 2019 at 17:44:25 UTC, Nicholas Wilson 
 wrote:
 Hmm,

 import std.traits;
 class WeightedRandom(T, W = float) if(isNumeric!W)
  {
 	 // Fields
 	 private W[T] _pairs;
 	 // The total sum of all the weights;
 	 private W _probabilities;

          /// Code...
  }

 void main()
 {
     auto wrnd = new WeightedRandom!char();
 }

 works for me: https://run.dlang.io/is/CjSubj
My bad. It seems like an invisible character sent the complier crazy. I re-wrote the unittest and now it works... Weird...
No, it's me being wrong again. Compiling it with 'dub test' produces the error, even in the main() function.
Apr 06