
On 8/10/2010 11:20 PM, Stephan T. Lavavej wrote:
(If VC10, aka 1600, is doing something wrong here, I'd like to know about it - with a self-contained repro.)
This is what I think it boils down to: template <int check> struct IntToVoid { typedef void type; }; template <typename T> struct TypeToZero { enum { value = 0 }; }; template <typename T> struct Empty { }; template<typename T> typename IntToVoid<(TypeToZero<Empty<T> >::value ) >::type foo(); template<typename T> typename IntToVoid<(TypeToZero<Empty<T> >::value ) >::type foo() {} int main() { foo<int>(); return 0; } 1>------ Build started: Project: test, Configuration: Debug x64 ------ 1> main.cpp 1>main.cpp(31): error C2668: 'foo' : ambiguous call to overloaded function 1> main.cpp(25): could be 'IntToBool<check>::type foo<int>(void)' 1> with 1> [ 1> check=0 1> ] 1> main.cpp(20): or 'IntToBool<check>::type foo<int>(void)' 1> with 1> [ 1> check=0 1> ] 1> while trying to match the argument list '(void)' ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== If one omits the () around TypeToZero<Empty<T> >::value, it compiles just fine: template<typename T> typename IntToVoid<TypeToZero<Empty<T> >::value >::type foo(); template<typename T> typename IntToVoid<TypeToZero<Empty<T> >::value >::type foo() {}