Thread overview
operator overloading and templates
Oct 04, 2011
jimmy
Oct 04, 2011
Ali Çehreli
October 04, 2011
Hi,

I have the following code.

struct Foo(int DIM) {
	Foo!(DIM) opBinary(string op) (Foo!(DIM) rhs)
		if (op == "+" || op == "-")
	{
		return Foo!(DIM)();
	}
}

unittest {
	auto u = Foo!(2)();
	auto v = Foo!(2)();
	assert(u + v == u);
}

I got the following during my test.

Z:\proj\D\gas>rdmd --main -unittest a.d
rdmd --main -unittest a.d
a.d(12): Error: incompatible types for ((u) + (v)): 'Foo!(2)' and
'Foo!(2)'
Failed: dmd -unittest -v -o- "a.d" -I"." >a.d.deps

I have no idea why the incompatible types error occurred.
October 04, 2011
On Tue, 04 Oct 2011 16:24:52 +0000, jimmy wrote:

> Hi,
> 
> I have the following code.
> 
> struct Foo(int DIM) {
> 	Foo!(DIM) opBinary(string op) (Foo!(DIM) rhs)
> 		if (op == "+" || op == "-")
> 	{
> 		return Foo!(DIM)();
> 	}
> }
> 
> unittest {
> 	auto u = Foo!(2)();
> 	auto v = Foo!(2)();
> 	assert(u + v == u);
> }
> 
> I got the following during my test.
> 
> Z:\proj\D\gas>rdmd --main -unittest a.d rdmd --main -unittest a.d
> a.d(12): Error: incompatible types for ((u) + (v)): 'Foo!(2)' and
> 'Foo!(2)'
> Failed: dmd -unittest -v -o- "a.d" -I"." >a.d.deps
> 
> I have no idea why the incompatible types error occurred.

This doesn't answer the issue and the error message above is useless at best, but here is a workaround:

    Foo opBinary(string op) (Foo rhs)
    if (op == "+" || op == "-")
    {
        writeln("My type: ", Foo.stringof);
        return Foo();
    }

Within the template definition, the name of the template alone means "that particular instantiation of the template".

Ali
October 05, 2011
On Tue, 04 Oct 2011 12:24:52 -0400, jimmy <zsu0915@yahoo.com.tw> wrote:

> Hi,
>
> I have the following code.
>
> struct Foo(int DIM) {
> 	Foo!(DIM) opBinary(string op) (Foo!(DIM) rhs)
> 		if (op == "+" || op == "-")
> 	{
> 		return Foo!(DIM)();
> 	}
> }
>
> unittest {
> 	auto u = Foo!(2)();
> 	auto v = Foo!(2)();
> 	assert(u + v == u);
> }
>
> I got the following during my test.
>
> Z:\proj\D\gas>rdmd --main -unittest a.d
> rdmd --main -unittest a.d
> a.d(12): Error: incompatible types for ((u) + (v)): 'Foo!(2)' and
> 'Foo!(2)'
> Failed: dmd -unittest -v -o- "a.d" -I"." >a.d.deps
>
> I have no idea why the incompatible types error occurred.

As Ali said, use Foo instead of Foo!DIM, but I think there is also a bug for this already.  I just can't find it right now...

-Steve