Boost logo

Boost :

Subject: Re: [boost] [type_erasure] overloading macro
From: Christophe Henry (christophe.j.henry_at_[hidden])
Date: 2013-02-26 16:58:08


I'm using mingw 4.7.2 -c -std=c++11, sandbox (83160).
I'll try tomorrow with a linux gcc 4.5.

Complete code:

#include <boost/type_erasure/concept_interface.hpp>
#include <boost/type_erasure/rebind_any.hpp>
#include <boost/type_erasure/derived.hpp>
#include <boost/type_erasure/is_placeholder.hpp>
#include <boost/type_erasure/constructible.hpp>
#include <boost/type_erasure/relaxed_match.hpp>
#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/builtin.hpp>
#include <boost/type_erasure/any_cast.hpp>
#include <boost/type_erasure/member.hpp>

#include <boost/mpl/vector.hpp>

#include <iostream>

namespace mpl = boost::mpl;
using namespace boost::type_erasure;

BOOST_TYPE_ERASURE_MEMBER((n1)(has_foo), foo);

struct Data{};

struct Test
{
    void foo(Data&&)const
    {
        std::cout << "foo(Data&&) called" << std::endl;
    }
    void foo(int,double)const
    {
        std::cout << "foo(int,double) called" << std::endl;
    }
};

int main()
{
    Test t;
    any<
        mpl::vector<
            n1::has_foo<void(Data&&),const _self>,
            n1::has_foo<void(int, double),const _self>,
            copy_constructible<>
>
> x (t);
    x.foo(Data());
    x.foo(1,1.0); // calls foo(int, double)
    return 0;
}

Error message:

..\testtyperasure\main.cpp: In instantiation of 'typename
boost::type_erasure::rebind_any<Base, R>::type
boost::type_erasure::concept_interface<n1::has_foo<R(A ...), T>, Base,
typename boost::enable_if<boost::type_erasure::detail::should_be_const<T,
Base>, typename boost::remove_const<T>::type>::type, typename
Base::_boost_type_erasure_has_memberfoo>::foo(typename
boost::type_erasure::as_param<Base, A>::type ...) const [with R = void; A =
{Data&&}; T = const boost::type_erasure::_self; Base =
boost::type_erasure::concept_interface<n1::has_foo<void(int, double), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<boost::type_erasure::copy_constructible<>,
boost::type_erasure::concept_interface<boost::type_erasure::constructible<boost::type_erasure::_self(const
boost::type_erasure::_self&)>,
boost::type_erasure::concept_interface<boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::any_base<boost::type_erasure::any<boost::mpl::vector<n1::has_foo<void(Data&&),
const boost::type_erasure::_self>, n1::has_foo<void(int, double), const
boost::type_erasure::_self>, boost::type_erasure::copy_constructible<> > >
>, boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>, boost::type_erasure::_self, void>;
typename Base::_boost_type_erasure_has_memberfoo = void; typename
boost::enable_if<boost::type_erasure::detail::should_be_const<T, Base>,
typename boost::remove_const<T>::type>::type = boost::type_erasure::_self;
typename boost::type_erasure::rebind_any<Base, R>::type = void; typename
boost::type_erasure::as_param<Base, A>::type = <type error>]':
..\testtyperasure\main.cpp:45:17: required from here
..\testtyperasure\main.cpp:19:1: error: no matching function for call to
'call(n1::has_foo<void(Data&&), const boost::type_erasure::_self>, const
boost::type_erasure::concept_interface<n1::has_foo<void(Data&&), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<n1::has_foo<void(int, double), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<boost::type_erasure::copy_constructible<>,
boost::type_erasure::concept_interface<boost::type_erasure::constructible<boost::type_erasure::_self(const
boost::type_erasure::_self&)>,
boost::type_erasure::concept_interface<boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::any_base<boost::type_erasure::any<boost::mpl::vector<n1::has_foo<void(Data&&),
const boost::type_erasure::_self>, n1::has_foo<void(int, double), const
boost::type_erasure::_self>, boost::type_erasure::copy_constructible<> > >
>, boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>&, Data)'
..\testtyperasure\main.cpp:19:1: note: candidates are:
In file included from
..\..\boost_1_52_0/boost/type_erasure/constructible.hpp:21:0,
                 from ..\testtyperasure\main.cpp:5:
..\..\boost_1_52_0/boost/type_erasure/call.hpp:333:1: note: template<class
Concept, class Op, class ... U> typename
boost::type_erasure::detail::call_result<Op, void(U&& ...), Concept>::type
boost::type_erasure::call(const boost::type_erasure::binding<Concept>&,
const Op&, U&& ...)
..\..\boost_1_52_0/boost/type_erasure/call.hpp:333:1: note: template
argument deduction/substitution failed:
..\testtyperasure\main.cpp:19:1: note: 'n1::has_foo<void(Data&&), const
boost::type_erasure::_self>' is not derived from 'const
boost::type_erasure::binding<Concept>'
In file included from
..\..\boost_1_52_0/boost/type_erasure/constructible.hpp:21:0,
                 from ..\testtyperasure\main.cpp:5:
..\..\boost_1_52_0/boost/type_erasure/call.hpp:366:1: note: template<class
Op, class ... U> typename boost::type_erasure::detail::call_result<Op,
void(U&& ...)>::type boost::type_erasure::call(const Op&, U&& ...)
..\..\boost_1_52_0/boost/type_erasure/call.hpp:366:1: note: template
argument deduction/substitution failed:
..\..\boost_1_52_0/boost/type_erasure/call.hpp: In substitution of
'template<class Op, class ... U> typename
boost::type_erasure::detail::call_result<Op, void(U&& ...)>::type
boost::type_erasure::call(const Op&, U&& ...) [with Op =
n1::has_foo<void(Data&&), const boost::type_erasure::_self>; U = {const
boost::type_erasure::concept_interface<n1::has_foo<void(Data&&), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<n1::has_foo<void(int, double), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<boost::type_erasure::copy_constructible<boost::type_erasure::_self>,
boost::type_erasure::concept_interface<boost::type_erasure::constructible<boost::type_erasure::_self(const
boost::type_erasure::_self&)>,
boost::type_erasure::concept_interface<boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::any_base<boost::type_erasure::any<boost::mpl::vector<n1::has_foo<void(Data&&),
const boost::type_erasure::_self>, n1::has_foo<void(int, double), const
boost::type_erasure::_self>,
boost::type_erasure::copy_constructible<boost::type_erasure::_self>,
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::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>&, Data}]':
..\testtyperasure\main.cpp:19:1: required from 'typename
boost::type_erasure::rebind_any<Base, R>::type
boost::type_erasure::concept_interface<n1::has_foo<R(A ...), T>, Base,
typename boost::enable_if<boost::type_erasure::detail::should_be_const<T,
Base>, typename boost::remove_const<T>::type>::type, typename
Base::_boost_type_erasure_has_memberfoo>::foo(typename
boost::type_erasure::as_param<Base, A>::type ...) const [with R = void; A =
{Data&&}; T = const boost::type_erasure::_self; Base =
boost::type_erasure::concept_interface<n1::has_foo<void(int, double), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<boost::type_erasure::copy_constructible<>,
boost::type_erasure::concept_interface<boost::type_erasure::constructible<boost::type_erasure::_self(const
boost::type_erasure::_self&)>,
boost::type_erasure::concept_interface<boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::any_base<boost::type_erasure::any<boost::mpl::vector<n1::has_foo<void(Data&&),
const boost::type_erasure::_self>, n1::has_foo<void(int, double), const
boost::type_erasure::_self>, boost::type_erasure::copy_constructible<> > >
>, boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>, boost::type_erasure::_self, void>;
typename Base::_boost_type_erasure_has_memberfoo = void; typename
boost::enable_if<boost::type_erasure::detail::should_be_const<T, Base>,
typename boost::remove_const<T>::type>::type = boost::type_erasure::_self;
typename boost::type_erasure::rebind_any<Base, R>::type = void; typename
boost::type_erasure::as_param<Base, A>::type = <type error>]'
..\testtyperasure\main.cpp:45:17: required from here
..\..\boost_1_52_0/boost/type_erasure/call.hpp:366:1: error: no type named
'type' in 'struct
boost::type_erasure::detail::call_result<n1::has_foo<void(Data&&), const
boost::type_erasure::_self>, void(const
boost::type_erasure::concept_interface<n1::has_foo<void(Data&&), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<n1::has_foo<void(int, double), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<boost::type_erasure::copy_constructible<>,
boost::type_erasure::concept_interface<boost::type_erasure::constructible<boost::type_erasure::_self(const
boost::type_erasure::_self&)>,
boost::type_erasure::concept_interface<boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::any_base<boost::type_erasure::any<boost::mpl::vector<n1::has_foo<void(Data&&),
const boost::type_erasure::_self>, n1::has_foo<void(int, double), const
boost::type_erasure::_self>, boost::type_erasure::copy_constructible<> > >
>, boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>&, Data&&), void>'
..\testtyperasure\main.cpp: In instantiation of 'typename
boost::type_erasure::rebind_any<Base, R>::type
boost::type_erasure::concept_interface<n1::has_foo<R(A ...), T>, Base,
typename boost::enable_if<boost::type_erasure::detail::should_be_const<T,
Base>, typename boost::remove_const<T>::type>::type, typename
Base::_boost_type_erasure_has_memberfoo>::foo(typename
boost::type_erasure::as_param<Base, A>::type ...) const [with R = void; A =
{Data&&}; T = const boost::type_erasure::_self; Base =
boost::type_erasure::concept_interface<n1::has_foo<void(int, double), const
boost::type_erasure::_self>,
boost::type_erasure::concept_interface<boost::type_erasure::copy_constructible<>,
boost::type_erasure::concept_interface<boost::type_erasure::constructible<boost::type_erasure::_self(const
boost::type_erasure::_self&)>,
boost::type_erasure::concept_interface<boost::type_erasure::destructible<boost::type_erasure::_self>,
boost::type_erasure::any_base<boost::type_erasure::any<boost::mpl::vector<n1::has_foo<void(Data&&),
const boost::type_erasure::_self>, n1::has_foo<void(int, double), const
boost::type_erasure::_self>, boost::type_erasure::copy_constructible<> > >
>, boost::type_erasure::_self, void>, boost::type_erasure::_self, void>,
boost::type_erasure::_self, void>, boost::type_erasure::_self, void>;
typename Base::_boost_type_erasure_has_memberfoo = void; typename
boost::enable_if<boost::type_erasure::detail::should_be_const<T, Base>,
typename boost::remove_const<T>::type>::type = boost::type_erasure::_self;
typename boost::type_erasure::rebind_any<Base, R>::type = void; typename
boost::type_erasure::as_param<Base, A>::type = <type error>]':
..\testtyperasure\main.cpp:45:17: required from here
..\testtyperasure\main.cpp:19:1: error: return-statement with a value, in
function returning 'void' [-fpermissive]


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk