Resolving conflicting functions

Bill Baxter dnewsgroup at billbaxter.com
Mon Dec 3 17:04:15 PST 2007


BCS wrote:
> Reply to Derek,
> 
>> I have a Currency data type,based on a struct.
>>
>> I want to divide a Currency value by a scalar to return a Currency and
>> I want to divide a Currency value by another Currency value to return
>> a scalar. This below is my attempt but fails to compile. How does one
>> do this?
>>
>> // ------------------------
>> real opDiv(Currency pFactor)
>> // ------------------------
>> {
>> return mData / pFactor.mData;
>> }
>> // ------------------------
>> Currency opDiv(T)(T pFactor)
>> // ------------------------
>> {
>> Currency temp;
>> temp = this.mData / pFactor;
>>
>> return temp;
>> }
>> I get the message ...
>>
>> template Currency.opDiv(T) conflicts with function Currency.opDiv
>>
> 
> you can't have a template and non-template by the same name
> 
> here is the nasty solution, ther might be a better one, but this should 
> work.
> 
> // ------------------------
> Ret!(T) opDiv(T)(T pFactor)
> // ------------------------
> {
>  Ret!(T) temp;
>  static if(is(T == Currency))
>    temp =  mData / pFactor.mData;
>  else
>    temp = this.mData / pFactor;
> 
>  return temp;
> }

Turning the plain opDiv into a template with a different number of 
arguments might work too:


// ------------------------
real opDiv(T=void,S=void)(Currency pFactor)
// ------------------------
{
   return mData / pFactor.mData;
}
// ------------------------
Currency opDiv(T)(T pFactor)
// ------------------------
{
   Currency temp;
   temp = this.mData / pFactor;
   return temp;
}

I say might because I'm not really sure when that trick works and when 
it doesn't.  I posted a question about it a while back but it seems no 
one else knows exactly how it works either.  (Or, more likely, they just 
found the question too boring. ;-)

--bb


More information about the Digitalmars-d-learn mailing list