Template member functions conflicting

Robin Allen r.a3 at ntlworld.com
Mon Feb 19 12:40:48 PST 2007


Bruno Medeiros wrote:
> Robin Allen wrote:
>> class Bang(T)
>> {
>>     void fn(U)( Bang!(U) ot) {}
>>         void fn(int q) {}
>> }
>>
>> Why do the two member functions conflict here? One takes a class 
>> instance and a type, the other takes an int.
>>
>> If this is intended, and it's not possible to overload a function with 
>> a template function, then maybe it should be?
> 
> They conflict, but there is an effective workaround, just turn the
> function into a nullary template (template with zero parameters):
> 
> import stdext.stdio;
> 
> class Bang(T)
> {
>     void fn(U)(Bang!(U) ot) { writeln("U template:", typeid(U) ); }
>     void fn() (int q) { writeln("nullary template");}
> }
> 
> 
> void main(char[][] args) {
>     auto foo = new Bang!(char);
> 
>     foo.fn(new Bang!(char));
>     foo.fn(42);
> }
> 

I tried this, but for me it just crashes the compiler. Probably because 
it's actually opMul I'm defining rather than a normal function. (I'm 
trying to make a Matrix class that you can multiply by another matrix or 
a vector.)

The actual code is more like this:

class Matrix(int X,int Y,T)
{
	Matrix!(X,OY,T) opMul(OY)( Matrix!(Y,OY,T) ot );
	Vector!(Y,T) opMul( Vector!(X,T) vec );
}

The only way I've been able to do it is by replacing one of the operator 
functions with a regular function. But it would be nice to do it with 
the * sign.




More information about the Digitalmars-d-learn mailing list