Subject: [Boost-bugs] [Boost C++ Libraries] #9913: boost::has_complement of enum class does not compile
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2014-04-15 19:36:02
#9913: boost::has_complement of enum class does not compile
-----------------------------------+-------------------------
Reporter: Nevin Liber <nevin@â¦> | Owner: johnmaddock
Type: Bugs | Status: new
Milestone: To Be Determined | Component: type_traits
Version: Boost 1.55.0 | Severity: Problem
Keywords: |
-----------------------------------+-------------------------
(Also filed this as a gcc bug at
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60852)
This works under gcc 4.7.2 and clang 3.4, but fails to compile under gcc
4.9 RC1. enum class seems to be the only issue; plain enums work fine.
#include <boost/type_traits.hpp>
#include <iostream>
enum class E {};
int main()
{ std::cout << boost::has_complement<E>() << std::endl; }
Using Boost 1.55 and 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)
^
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/9913> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:16 UTC