Template member functions conflicting

Bill Baxter dnewsgroup at billbaxter.com
Mon Feb 19 13:19:15 PST 2007


Chris Nicholson-Sauls wrote:
> 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.

No the rule is that you can't overload _only_ on return type.  If the 
arguments are distinct then you can overload.  This works for instance:

struct Foo
{
     int frob(int a) { return a; }
     char[] frob(char[] a) { return a; }
}


void main()
{
     Foo f;
     int x = f.frob(3);
     char[] y = f.frob("hithere");
}


>  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.

Yeh, that sounds like a bug.
File it here when you have a small repro case:
    http://d.puremagic.com/issues/

--bb


More information about the Digitalmars-d-learn mailing list