We are seeing build problems with gcc 4.9 RC1 and Boost 1.55. Given the
following test program:
#include
#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::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::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())))==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::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::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