I've had this one too. I think it's a bug, because foo is already constructed when foo(1.5) is used. So the compiler should know it's an opCall and not a constructor call. The only solution I found was a kludge:
struct Foo(T) { void initialize(T)(T x) {} // in my case, their was some data initialization there. void opCall(U)(U y) {} }