
Hi, Can anyone explain why the following won't compile (using g++ 3.3.2 under Linux): #include <boost/utility/enable_if.hpp> #include <boost/type_traits/is_convertible.hpp> using namespace std; struct Foo { Foo() {} template <typename T> Foo(T const & src, typename boost::enable_if< boost::is_convertible<T,Foo>, void >::type * dummy = 0) { int i = 1; // filler. } template <typename T> Foo(T const & src, typename boost::disable_if< boost::is_convertible<T,Foo>, void >::type * dummy = 0) { int i = 2; // ditto. } }; int main() { Foo f; Foo f2(f); return 0; }; When I attempt to compile this code with g++ 3.3.2, I get the following error messages: /boost/boost/type_traits/is_convertible.hpp: In instantiation of `boost::disable_if<boost::is_convertible<Foo, Foo>, void>': /boost/boost/type_traits/is_convertible.hpp:128: instantiated from `boost::detail::is_convertible_basic_impl<Foo&, Foo>' /boost/boost/type_traits/is_convertible.hpp:228: instantiated from `boost::detail::is_convertible_impl<Foo, Foo>' test.cpp:36: instantiated from `boost::detail::is_convertible_impl_dispatch<Foo, Foo>' test.cpp:36: instantiated from `boost::is_convertible<Foo, Foo>' test.cpp:36: instantiated from `boost::enable_if<boost::is_convertible<Foo, Foo>, void>' test.cpp:36: instantiated from here /boost/boost/type_traits/is_convertible.hpp:128: error: `value' is not a member of type `boost::is_convertible<Foo, Foo>' /boost/boost/type_traits/is_convertible.hpp: In instantiation of `boost::detail::is_convertible_basic_impl<Foo&, Foo>': /boost/boost/type_traits/is_convertible.hpp:228: instantiated from `boost::detail::is_convertible_impl<Foo, Foo>' test.cpp:36: instantiated from `boost::detail::is_convertible_impl_dispatch<Foo, Foo>' test.cpp:36: instantiated from `boost::is_convertible<Foo, Foo>' test.cpp:36: instantiated from `boost::enable_if<boost::is_convertible<Foo, Foo>, void>' test.cpp:36: instantiated from here /boost/boost/type_traits/is_convertible.hpp:128: error: initializing argument 1 of `static yes_type boost::detail::checker<T>::_m_check(T, int) [with T = Foo]' If I use boost::is_same<> in place of boost::is_convertible<>, everything is fine. Is there something that I'm missing, or is this a bug? Thanks in advance, Tim