I take your first example and the relevant class part looks now like this:
class Vector2D(T) {
public:
        T x;
        T y;

        this() { }

        /**
        *
        */
        static Vector2D!(T) opCall(U, V)(U x, V y) {
                Vector2D!(T) vec = new Vector2D!(T)();
                vec.x = cast(T) x;
                vec.y = cast(T) y;

                return vec;
        }
        
        /**
        *
        */
        static Vector2D!(T) opCall(U)(const Vector2D!(U) vec) {
                assert(vec !is null);

                return Vector2D!(T)(vec.x, vec.y);
        }
        
        U opCast(U)() const
                if (is(Unqual!U == Vector2D!byte) ||
                        is(Unqual!U == Vector2D!ubyte) ||
                        is(Unqual!U == Vector2D!short) ||
                        is(Unqual!U == Vector2D!ushort) ||
                        is(Unqual!U == Vector2D!int) ||
                        is(Unqual!U == Vector2D!uint) ||
                        is(Unqual!U == Vector2D!long) ||
                        is(Unqual!U == Vector2D!ulong) ||
                        is(Unqual!U == Vector2D!float) ||
                        is(Unqual!U == Vector2D!double) ||
                        is(Unqual!U == Vector2D!real))
        {
                U v = new U(this.x, this.y);
        }

As you see i have a static opCall.
But now i get this compiler errors:
cast.d(309): Error: template instance opCast!(Object) opCast!(Object) does not m atch template declaration opCast(U) if (is(Unqual!(U) == Vector2D!(byte)) || is( Unqual!(U) == Vector2D!(ubyte)) || is(Unqual!(U) == Vector2D!(short)) || is(Unqu al!(U) == Vector2D!(ushort)) || is(Unqual!(U) == Vector2D!(int)) || is(Unqual!(U ) == Vector2D!(uint)) || is(Unqual!(U) == Vector2D!(long)) || is(Unqual!(U) == V ector2D!(ulong)) || is(Unqual!(U) == Vector2D!(float)) || is(Unqual!(U) == Vecto
r2D!(double)) || is(Unqual!(U) == Vector2D!(real)))
cast.d(309): Error: function expected before (), not vs2.opCast!(Object) of type
 void
cast.d(309): Error: template instance opCast!(Object) opCast!(Object) does not m atch template declaration opCast(U) if (is(Unqual!(U) == Vector2D!(byte)) || is( Unqual!(U) == Vector2D!(ubyte)) || is(Unqual!(U) == Vector2D!(short)) || is(Unqu al!(U) == Vector2D!(ushort)) || is(Unqual!(U) == Vector2D!(int)) || is(Unqual!(U ) == Vector2D!(uint)) || is(Unqual!(U) == Vector2D!(long)) || is(Unqual!(U) == V ector2D!(ulong)) || is(Unqual!(U) == Vector2D!(float)) || is(Unqual!(U) == Vecto
r2D!(double)) || is(Unqual!(U) == Vector2D!(real)))
cast.d(309): Error: function expected before (), not vf.opCast!(Object) of type
void

It seems that opCast and opEquals don't like each other.
Line 309 is
if (vs2 == vf) {

Reply via email to