void myFunc(T: !=int)(T value)

tsalm tsalm at free.fr
Fri Aug 22 07:52:04 PDT 2008


Le Fri, 22 Aug 2008 15:23:11 +0200, Steven Schveighoffer  
<schveiguy at yahoo.com> a écrit:

> "tsalm" wrote
>> Le Fri, 22 Aug 2008 14:33:23 +0200, Jarrett Billingsley
>> <kb3ctd2 at yahoo.com> a écrit:
>>
>>> -------------------------------------------
>>> "tsalm" <tsalm at free.fr> wrote in message
>>> news:op.ugacfwj7010shu at papillon.lan...
>>> Hello,
>>>
>>> I want to do something like this :
>>>
>>> class MyClass
>>> {
>>>    void myFunc(int intValue)
>>>    {
>>>      /* Do something with this int */
>>>    }
>>>
>>>    void myFunc(T: !=int)(T valueNotInt)
>>>    {
>>>      /* valueNotInt can not be an int */
>>>    }
>>> }
>>>
>>> Thanks in advance,
>>> TSalm
>>> -------------------------------------------
>>>
>>> void myFunc(T: int)(int intValue) {}
>>> void myFunc(T)(T notIntValue) {}
>>>
>>> :)
>>>
>>
>> In fact, the exact operator is :
>>   int opCmp(MyStruct m)
>>
>> It must be use, when this struct is in an array, to sort this array
>> And strangly, the method
>>    int opCmp(T:MyStruct)(MyStruct m)
>> is not take by ".sort"
>> :(
>
> Ah, your problem is that template methods cannot be virtual.  .sort is
> trying to use the virtual method int opCmp(Object) in Object.
>
> Overload with Object as the argument for the non-int function:
>
> int opCmp(Object o); // this will be used in .sort
> int opCmp(int i);
>
> -Steve
>
>


I don't explain myself clearly ...

This problem concern a "bug" on tango :
http://www.dsource.org/projects/tango/ticket/1259#preview

Here's a better example :

/***************************************/

struct MyStruct
{
  int a;

  // Must be use to sort this struct on an array
  // but the compilation send a conflict with "opCmp(T)(T val)"
  int opCmp(MyStruct m)
  {
    return a - m.a;
  }

  // I need this to compare with other objects
  int opCmp(T)(T val)
  { /* ... */}

}

void main()
{
  MyStruct a,b,c,d;
  a.a = 5;
  b.a = 1;
  c.a = 10;
  d.a = -1;

  MyStruct[] array = [a,b,c,d];

  array.sort;

  foreach(el;array)
  {
   Stdout(el.a).newline;
  }

}
/***************************************/


More information about the Digitalmars-d-learn mailing list