|
Boost Users : |
Subject: Re: [Boost-users] [TypeErasure] Reference of forward declared type requires complete type
From: Yuan Yao (yaoyuan0123_at_[hidden])
Date: 2015-09-04 00:26:39
On 2015-09-03 23:36:03, Steven Watanabe wrote:
> > <snip>
> >
> > struct Type;
> >
> > BOOST_TYPE_ERASURE_MEMBER((HasTest), Test, 1)
> >
> > <snip>
> > HasTest<void(Type&)>,
> > <snip>
> > ================================================
> >
> > However, the compiler (e.g. clang) complains about incomplete type:
> >
> > ================================================
> > /usr/local/include/boost/type_traits/is_base_and_derived.hpp:228:42:
> > error: incomplete type 'Type' used in type trait expression
> > BOOST_STATIC_CONSTANT(bool, value = (BOOST_IS_BASE_OF(B,D) && !
> > ::boost::is_same<ncvB,ncvD>::value));
> > ================================================
> >
> > Replacing Type& with Type* can fix the problem. Is this a bug?
> >
>
> Probably. Is boost::type_erasure::is_placeholder in
> the instantiation backtrace?
Yes. And the following is the full error message:
================================================
In file included from main.cpp:1:
In file included from /usr/local/include/boost/type_erasure/any.hpp:36:
In file included from
/usr/local/include/boost/type_erasure/detail/normalize.hpp:30:
In file included from
/usr/local/include/boost/type_erasure/detail/get_placeholders.hpp:25:
In file included from
/usr/local/include/boost/type_erasure/is_placeholder.hpp:15:
/usr/local/include/boost/type_traits/is_base_and_derived.hpp:228:42:
error: incomplete type 'Type' used in type trait expression
BOOST_STATIC_CONSTANT(bool, value = (BOOST_IS_BASE_OF(B,D) && !
::boost::is_same<ncvB,ncvD>::value));
^
/usr/local/include/boost/type_traits/intrinsics.hpp:189:53: note:
expanded from macro 'BOOST_IS_BASE_OF'
# define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) &&
!is_same<T,U>::value)
^
/usr/local/include/boost/config/suffix.hpp:394:72: note: expanded from
macro 'BOOST_STATIC_CONSTANT'
# define BOOST_STATIC_CONSTANT(type, assignment) static const type
assignment
^
/usr/local/include/boost/type_traits/is_base_and_derived.hpp:237:25:
note: in instantiation of template class
'boost::detail::is_base_and_derived_impl<boost::type_erasure::placeholder,
Type>' requested here
, (::boost::detail::is_base_and_derived_impl<Base,Derived>::value)
^
/usr/local/include/boost/type_traits/detail/bool_trait_def.hpp:74:30:
note: expanded from macro 'BOOST_TT_AUX_BOOL_TRAIT_DEF2'
BOOST_TT_AUX_BOOL_C_BASE(C) \
^
/usr/local/include/boost/type_traits/detail/bool_trait_def.hpp:55:81:
note: expanded from macro 'BOOST_TT_AUX_BOOL_C_BASE'
# define BOOST_TT_AUX_BOOL_C_BASE(C) : public
::boost::integral_constant<bool,C>
^
/usr/local/include/boost/type_erasure/is_placeholder.hpp:27:25: note: in
instantiation of template class
'boost::is_base_and_derived<boost::type_erasure::placeholder, Type>'
requested here
struct is_placeholder : ::boost::is_base_and_derived<placeholder, T> {};
^
/usr/local/include/boost/mpl/aux_/nested_type_wknd.hpp:27:7: note: in
instantiation of template class
'boost::type_erasure::is_placeholder<Type>' requested here
: T::type
^
/usr/local/include/boost/mpl/not.hpp:41:11: note: in instantiation of
template class
'boost::mpl::aux::nested_type_wknd<boost::type_erasure::is_placeholder<Type>
>' requested here
BOOST_MPL_AUX_NESTED_TYPE_WKND(T)::value
^
/usr/local/include/boost/mpl/aux_/nested_type_wknd.hpp:38:24: note:
expanded from macro 'BOOST_MPL_AUX_NESTED_TYPE_WKND'
::boost::mpl::aux::nested_type_wknd<T> \
^
/usr/local/include/boost/mpl/aux_/nested_type_wknd.hpp:27:7: note: in
instantiation of template class
'boost::mpl::not_<boost::type_erasure::is_placeholder<Type> >' requested
here
: T::type
^
/usr/local/include/boost/mpl/aux_/preprocessed/gcc/or.hpp:51:11: note:
(skipping 17 contexts in backtrace; use -ftemplate-backtrace-limit=0 to
see all)
BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
^
/usr/local/include/boost/mpl/aux_/nested_type_wknd.hpp:38:24: note:
expanded from macro 'BOOST_MPL_AUX_NESTED_TYPE_WKND'
::boost::mpl::aux::nested_type_wknd<T> \
^
/usr/local/include/boost/mpl/eval_if.hpp:38:22: note: in instantiation
of template class 'boost::mpl::fold<boost::mpl::vector<HasTest<void
(Type &), boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::mpl::s_item<boost::mpl::vector<HasTest<void (Type &),
boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::mpl::set0<mpl_::na> >,
boost::type_erasure::detail::collect_concepts<mpl_::arg<2>,
boost::mpl::map0<mpl_::na>, mpl_::arg<1> > >' requested here
typedef typename f_::type type;
^
/usr/local/include/boost/type_erasure/detail/normalize.hpp:388:36: note:
in instantiation of template class
'boost::mpl::eval_if<boost::mpl::is_sequence<boost::mpl::vector<HasTest<void
(Type &), boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >,
boost::mpl::fold<boost::mpl::vector<HasTest<void (Type &),
boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::mpl::s_item<boost::mpl::vector<HasTest<void (Type &),
boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::mpl::set0<mpl_::na> >,
boost::type_erasure::detail::collect_concepts<mpl_::arg<2>,
boost::mpl::map0<mpl_::na>, mpl_::arg<1> > >,
boost::mpl::identity<boost::mpl::s_item<boost::mpl::vector<HasTest<void
(Type &), boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::mpl::set0<mpl_::na> > > >' requested here
typedef typename ::boost::mpl::eval_if<
::boost::mpl::is_sequence<Concept>,
^
/usr/local/include/boost/type_erasure/any.hpp:65:49: note: in
instantiation of template class
'boost::type_erasure::detail::collect_concepts<boost::mpl::vector<HasTest<void
(Type &), boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::mpl::map0<mpl_::na>, boost::mpl::set0<mpl_::na> >' requested here
typename ::boost::type_erasure::detail::collect_concepts<
^
/usr/local/include/boost/type_erasure/any.hpp:132:43: note: in
instantiation of template class
'boost::type_erasure::detail::compute_bases<boost::type_erasure::any<boost::mpl::vector<HasTest<void
(Type &), boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::type_erasure::_self>, boost::mpl::vector<HasTest<void (Type &),
boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::type_erasure::_self>' requested here
public ::boost::type_erasure::detail::compute_bases<
^
main.cpp:17:10: note: in instantiation of template class
'boost::type_erasure::any<boost::mpl::vector<HasTest<void (Type &),
boost::type_erasure::_self>,
boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,
boost::type_erasure::_self>' requested here
Any obj;
^
main.cpp:4:8: note: forward declaration of 'Type'
struct Type;
^
1 error generated.
================================================
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net