On Wednesday, 23 April 2014 at 16:44:37 UTC, Charles McAnany wrote:
Friends,

I have a class that needs two constructors:

class Foo{
    this(int x){}
    this(T)(T x) if(!is(T == int)){}
}
void main(){}

But this does not compile because the two constructors conflict:

buggy.d(3): Error: template buggy.Foo.__ctor(T)(T x) if (!is(T == int)) conflicts with constructor buggy.Foo.this at buggy.d(2)

Of course, I can just have one constructor that doesn't have the constraint and then use a static if to redirect to a private method, but that seems clunky to me. (not to mention it would complicate the documentation.)

Any ideas?

Cheers,
Charles McAnany.

Update your compiler. What version are you on? This was resolved in the 2.064 release. You don't even need the "if(!is(T == int))", since non-template takes precendence.

//----
class Foo{
    this(int x){}
    this(T)(T x) {}
}
void main()
{
    auto a = new Foo(5);
}
//----

If you can't update your compiler, an alternative is to make your non-template version an actual template:

class Foo{
    this(T : int)(T x){}
    this(T)(T x) {}
}

Reply via email to