Template member functions conflicting

Chris Nicholson-Sauls ibisbasenji at gmail.com
Mon Feb 19 12:59:08 PST 2007

Robin Allen wrote:
> 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.

That won't typically work as you cannot overload on return types.  If user code /only 
ever/ passed either Matrix or Vector with your opMul it might pass... but I'm dubious.  In 
this case I would recommend just defining opMul for Matrix, and providing a function for 
multiplying with a Vector.

The fact that it crashes the compiler, though, is another manner.  Try to find a small 
test case that produces it and you may have a bug report to file.

-- Chris Nicholson-Sauls

More information about the Digitalmars-d-learn mailing list