it seems to be that Foo + operater wasn't instantiated and thus never properly functions for the call. where as you're workaround gives a way to deduce and is actually a template now, where as it can't use the operator as a template and thus never functions due to it never doing anything since operator itself does not provide template functionality.