Opened 9 years ago

Closed 8 years ago

#9418 closed Bugs (fixed)

key of fusion map could not be abstract type

Reported by: record.nctu.cis91@… Owned by: Joel de Guzman
Milestone: To Be Determined Component: fusion
Version: Boost 1.55.0 Severity: Problem
Keywords: Cc:

Description

The following code fails to be compiled with Boost 1.55.0 using gcc 4.8.1. But work with Boost 1.53.0 using gcc 4.8.1.

#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/pair.hpp>

namespace bf = boost::fusion;

struct tagging
{
    virtual void foo() = 0;
};

int main()
{
    bf::map<bf::pair<tagging, int>> booom;

    return 0;
}

gcc complains with the following

In file included from /usr/local/include/boost/fusion/container/map/map_fwd.hpp:24:0,
                 from /usr/local/include/boost/fusion/container/map/map.hpp:10,
                 from /usr/local/include/boost/fusion/container/map.hpp:10,
                 from /usr/local/include/boost/fusion/include/map.hpp:10,
                 from main.cpp:1:
/usr/local/include/boost/fusion/container/map/detail/map_impl.hpp: In instantiation of ‘struct boost::fusion::detail::map_impl<0, boost::fusion::pair<tagging, int> >’:
/usr/local/include/boost/fusion/container/map/map.hpp:45:12:   required from ‘struct boost::fusion::map<boost::fusion::pair<tagging, int> >’
main.cpp:13:37:   required from here
/usr/local/include/boost/fusion/container/map/detail/map_impl.hpp:116:18: error: cannot allocate an object of abstract type ‘tagging’
         key_type get_key(mpl::int_<index>);
                  ^
main.cpp:6:8: note:   because the following virtual functions are pure within ‘tagging’:
 struct tagging
        ^
main.cpp:8:18: note:    virtual void tagging::foo()
     virtual void foo() = 0;
                  ^
In file included from /usr/local/include/boost/fusion/container/map/map_fwd.hpp:24:0,
                 from /usr/local/include/boost/fusion/container/map/map.hpp:10,
                 from /usr/local/include/boost/fusion/container/map.hpp:10,
                 from /usr/local/include/boost/fusion/include/map.hpp:10,
                 from main.cpp:1:
/usr/local/include/boost/fusion/container/map/detail/map_impl.hpp:117:18: error: cannot allocate an object of abstract type ‘tagging’
         key_type get_key(mpl::int_<index>) const;
                  ^
main.cpp:6:8: note:   since type ‘tagging’ has pure virtual functions
 struct tagging
        ^

I guess the failure is caused by the return value of 'get_key' in 'map_impl'.

Change History (2)

comment:1 by record.nctu.cis91@…, 9 years ago

Component: functionfusion
Owner: changed from Douglas Gregor to Joel de Guzman

comment:2 by Joel de Guzman, 8 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.