Agoston Bejo wrote:
Has anyone succeeded in specializing class templates with enable_if under VC++7.1?
Yes, I do it once in a while. I'd do it more if I didn't have to support old compilers.
I have created the simplest example possible and cannot imagine how I could rewrite so that no Internal Compiler Error occurs.
Obviously the ICE is a microsoft bug. It occurs in VC8.0 beta, too, so it should be reported. However, the real problem is that int and float both satisfy is_object and is_arithmetic, so two partial specializations match equally well. Here's the output from como 4.3.3: "C:\DOCUME~1\turkanis\Home\C++\overloadvc71\example.cpp", line 31: error: more than one partial specialization matches the template argument list of class "A<float, void>" "A<T, boost::enable_if<boost::is_arithmetic<T>, void>::type>" "A<T, boost::enable_if<boost::is_object<T>, void>::type>" cout << Afloat::X << endl; // Internal Compiler Error ^ "C:\DOCUME~1\turkanis\Home\C++\overloadvc71\example.cpp", line 32: error: more than one partial specialization matches the template argument list of class "A<int, void>" "A<T, boost::enable_if<boost::is_arithmetic<T>, void>::type>" "A<T, boost::enable_if<boost::is_object<T>, void>::type>" cout << A<int>::X << endl; Jonathan