December 09, 2004
template TVector(T,uint SZ)
{
  class Vector
  {
    T[SZ]     values;

    Vector  MyFunct(T f)
    {
      return new Vector();
    }
  }
}

class V3f : TVector!(float,3).Vector {}

void main( char[][] arg )
{
  V3f  v = new V3f();
  v = v.MyFunct(100.0f);
}

...
compiler gives me:

> "C:\dmd\bin\dmd.exe" -debug -c E:\proj\temp\bug2.d
E:\proj\temp\bug2.d(23): cannot implicitly convert expression cast(Vector )(v).MyFunct(100) of type Vector to V3f

Should not this conversion be implicit?
December 09, 2004
"David Medlock" <amedlock@nospam.org> wrote in message news:cp9ng4$c9p$1@digitaldaemon.com...
> template TVector(T,uint SZ)
> {
>    class Vector
>    {
>      T[SZ]     values;
>
>      Vector  MyFunct(T f)
>      {
>        return new Vector();
>      }
>    }
> }
>
> class V3f : TVector!(float,3).Vector {}
>
> void main( char[][] arg )
> {
>    V3f  v = new V3f();
>    v = v.MyFunct(100.0f);
> }
>
> ...
> compiler gives me:
>
>  > "C:\dmd\bin\dmd.exe" -debug -c E:\proj\temp\bug2.d
> E:\proj\temp\bug2.d(23): cannot implicitly convert expression
> cast(Vector )(v).MyFunct(100) of type Vector to V3f
>
> Should not this conversion be implicit?

The return type of MyFunct is Vector but it is assigning to a variable of
type V3f, which is not allowed without a cast. It is like
class Foo;
class Bar : Foo;
...
Bar x;
...
x = new Foo;
...
But this is allowed:
Foo y;
y = new Bar;

By the way, your example can be shortened to:
class Vector(T,uint SZ)
{
  T[SZ]     values;

  Vector  MyFunct(T f)
  {
    return new Vector();
  }
}

class V3f : Vector!(float,3) {}

void main( char[][] arg )
{
   V3f  v = new V3f();
   v = v.MyFunct(100.0f);
}