
We are seeing build problems with gcc 4.9 RC1 and Boost 1.55. Given the following test program: #include <boost/type_traits.hpp> #include <iostream> enum class E {}; int main() { std::cout << boost::has_complement<E>() << std::endl; } Using g++ -std=c++11, we get: In file included from */opt/local/include/boost/config.hpp:57:0*, from */opt/local/include/boost/type_traits/add_const.hpp:13*, from */opt/local/include/boost/type_traits.hpp:13*, from *a.cpp:1*: /opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp: In instantiation of '*const bool boost::detail::has_complement_impl::operator_exists<E>::value*': */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:173:4:* required from '*const bool boost::detail::has_complement_impl::trait_impl1<E, boost::detail::has_complement_impl::dont_care, false>::value*' */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:195:4:* required from '*const bool boost::detail::has_complement_impl::trait_impl<E, boost::detail::has_complement_impl::dont_care>::value*' */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:202:1:* required from '*struct boost::has_complement<E>*' *a.cpp:7:41:* required from here */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:152:56:* *error: *no match for '*operator~*' (operand type is '*E*') BOOST_STATIC_CONSTANT(bool, value = (sizeof(check(((BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type))); * ^* /opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp: In instantiation of '*const bool boost::detail::has_complement_impl::operator_returns_void<E>::value*': */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:173:4:* required from '*const bool boost::detail::has_complement_impl::trait_impl1<E, boost::detail::has_complement_impl::dont_care, false>::value*' */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:195:4:* required from '*const bool boost::detail::has_complement_impl::trait_impl<E, boost::detail::has_complement_impl::dont_care>::value*' */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:202:1:* required from '*struct boost::has_complement<E>*' *a.cpp:7:41:* required from here */opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:89:102:* *error: *no match for '*operator~*' (operand type is '*E*') BOOST_STATIC_CONSTANT(bool, value = (sizeof(::boost::type_traits::yes_type)==sizeof(returns_void((BOOST_TT_TRAIT_OP make<Rhs>(),returns_void_t()))))); * ^* *a.cpp:* In function '*int main()*': *a.cpp:7:41:* *error: *cannot bind '*std::ostream {aka std::basic_ostream<char>}*' lvalue to '*std::basic_ostream<char>&&*' { std::cout << boost::has_complement<E>() << std::endl; } * ^* In file included from */opt/local/include/gcc49/c++/istream:39:0*, from */opt/local/include/gcc49/c++/sstream:38*, from */opt/local/include/gcc49/c++/complex:45*, from */opt/local/include/boost/type_traits/is_complex.hpp:12*, from */opt/local/include/boost/type_traits.hpp:49*, from *a.cpp:1*: */opt/local/include/gcc49/c++/ostream:602:5:* *note: *initializing argument 1 of '*std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = boost::has_complement<E>]*' operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) * ^* It compiles fine under gcc 4.7.2 and clang 3.4. It also compiles fine for plain enums. Any ideas? -- Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404