为什么这个成员函数是重复的?

时间:2015-12-24 09:43:20

标签: boost boost-multi-index template-instantiation

我有一些代码可以在VS10上运行并可以在其他几个平台上运行,但在VS2015上会导致一个奇怪的错误。错误(在Boost中的模板扩展中)非常奇怪,因为它指向没有const的表单,并且告诉我它在源代码中紧跟前一个成员函数,这是一个添加const的变体。

这是我设法从有问题的程序中提取的最小例子。

#define BOOST_MULTI_INDEX_DISABLE_SERIALIZATION
#include "boost/multi_index_container.hpp"
#include "boost/multi_index/key_extractors.hpp"
#include "boost/multi_index/ordered_index.hpp"

class C1 { };

class  C2 {
public:
    uint32_t xx1;
    C1 f2() const;
};

namespace bmi = boost::multi_index;

typedef boost::multi_index_container<
    std::shared_ptr< const C2 >,
    bmi::indexed_by<
        bmi::ordered_unique<
            bmi::tag<C1>,
            bmi::composite_key<
                const C2,
                bmi::const_mem_fun< C2, C1, &C2::f2 >,
                bmi::member< C2, const uint32_t, &C2::xx1 >
            > // composite
        > // ordered_unique
    > // indexed_by
> BadContainerBase;

struct BadType : public BadContainerBase { };

我正在使用VS2015,目标是x86(32位)。

完整错误是:

E:\C++Libs\boost_1_59_0\boost/multi_index/composite_key.hpp(638): error C2535: 'boost::multi_index::composite_key_result<boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>::operator ()(const boost::reference_wrapper<const Class> &) const': member function already defined or declared
        with
        [
            Class=C2
        ]
E:\C++Libs\boost_1_59_0\boost/multi_index/composite_key.hpp(632): note: see declaration of 'boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>::operator ()'
E:\C++Libs\boost_1_59_0\boost/multi_index/detail/ord_index_args.hpp(46): note: see reference to class template instantiation 'boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>' being compiled
E:\C++Libs\boost_1_59_0\boost/mpl/eval_if.hpp(41): note: see reference to class template instantiation 'boost::multi_index::detail::index_args_default_compare<boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>' being compiled
E:\C++Libs\boost_1_59_0\boost/multi_index/detail/ord_index_args.hpp(70): note: see reference to class template instantiation 'boost::mpl::eval_if<boost::mpl::is_na<boost::mpl::na>,boost::multi_index::detail::index_args_default_compare<boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,boost::mpl::identity<boost::mpl::na>>' being compiled
E:\C++Libs\boost_1_59_0\boost/multi_index/ordered_index.hpp(65): note: see reference to class template instantiation 'boost::multi_index::detail::ordered_index_args<Arg1,Arg2,Arg3>' being compiled
        with
        [
            Arg1=boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,
            Arg2=boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
            Arg3=boost::mpl::na
        ]
E:\C++Libs\boost_1_59_0\boost/multi_index/detail/node_type.hpp(44): note: see reference to class template instantiation 'boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>' being compiled
E:\C++Libs\boost_1_59_0\boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp(49): note: see reference to class template instantiation 'boost::multi_index::detail::index_node_applier::apply<T1,T2>' being compiled
        with
        [
            T1=boost::mpl::v_iter<boost::mpl::vector1<boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>>,0>,
            T2=boost::multi_index::detail::index_node_base<std::shared_ptr<const C2>,std::allocator<std::shared_ptr<const C2>>>
        ]
E:\C++Libs\boost_1_59_0\boost/mpl/aux_/preprocessed/plain/bind.hpp(207): note: see reference to class template instantiation 'boost::mpl::apply_wrap2<boost::multi_index::detail::index_node_applier,boost::mpl::v_iter<boost::mpl::vector1<T0>,0>,boost::multi_index::detail::index_node_base<Value,Allocator>>' being compiled
        with
        [
            T0=boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>,
            Value=std::shared_ptr<const C2>,
            Allocator=std::allocator<std::shared_ptr<const C2>>
        ]
E:\C++Libs\boost_1_59_0\boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp(49): note: see reference to class template instantiation 'boost::mpl::bind2<boost::multi_index::detail::index_node_applier,boost::mpl::_2,boost::mpl::_  ::apply<T1,T2,boost::mpl::na,boost::mpl::na,boost::mpl::na>' being compiled
        with
        [
            T1=boost::multi_index::detail::index_node_base<std::shared_ptr<const C2>,std::allocator<std::shared_ptr<const C2>>>,
            T2=boost::mpl::v_iter<boost::mpl::vector1<boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>>,0>
        ]
E:\C++Libs\boost_1_59_0\boost/mpl/aux_/preprocessed/plain/apply.hpp(63): note: see reference to class template instantiation 'boost::mpl::apply_wrap2<boost::mpl::bind2<boost::multi_index::detail::index_node_applier,boost::mpl::_2,boost::mpl::_  ,T1,T2>' being compiled
        with
        [
            T1=boost::multi_index::detail::index_node_base<std::shared_ptr<const C2>,std::allocator<std::shared_ptr<const C2>>>,
            T2=boost::mpl::v_iter<boost::mpl::vector1<boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>>,0>
        ]
E:\C++Libs\boost_1_59_0\boost/mpl/aux_/preprocessed/plain/reverse_iter_fold_impl.hpp(58): note: see reference to class template instantiation 'boost::mpl::apply2<BackwardOp,boost::multi_index::detail::index_node_base<Value,Allocator>,boost::mpl::v_iter<boost::mpl::vector1<T0>,0>>' being compiled
        with
        [
            BackwardOp=boost::mpl::bind2<boost::multi_index::detail::index_node_applier,boost::mpl::_2,boost::mpl::_  ,
            Value=std::shared_ptr<const C2>,
            Allocator=std::allocator<std::shared_ptr<const C2>>,
            T0=boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>
        ]
E:\C++Libs\boost_1_59_0\boost/mpl/reverse_iter_fold.hpp(43): note: see reference to class template instantiation 'boost::mpl::aux::reverse_iter_fold_impl<1,boost::mpl::v_iter<boost::mpl::vector1<T0>,0>,boost::mpl::v_iter<boost::mpl::vector1<T0>,  ,State,boost::mpl::bind2<boost::multi_index::detail::index_node_applier,boost::mpl::_2,boost::mpl::_  ,boost::mpl::protect<boost::mpl::arg<  ,0>>' being compiled
        with
        [
            T0=boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>,
            State=boost::multi_index::detail::index_node_base<std::shared_ptr<const C2>,std::allocator<std::shared_ptr<const C2>>>
        ]
E:\C++Libs\boost_1_59_0\boost/multi_index/detail/node_type.hpp(57): note: see reference to class template instantiation 'boost::mpl::reverse_iter_fold<IndexSpecifierList,boost::multi_index::detail::index_node_base<Value,Allocator>,boost::mpl::bind2<boost::multi_index::detail::index_node_applier,boost::mpl::_2,boost::mpl::_  ,boost::mpl::arg<  >' being compiled
        with
        [
            IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,
            Value=std::shared_ptr<const C2>,
            Allocator=std::allocator<std::shared_ptr<const C2>>
        ]
E:\C++Libs\boost_1_59_0\boost/multi_index_container.hpp(89): note: see reference to class template instantiation 'boost::multi_index::detail::multi_index_node_type<Value,IndexSpecifierList,Allocator>' being compiled
        with
        [
            Value=std::shared_ptr<const C2>,
            IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,
            Allocator=std::allocator<std::shared_ptr<const C2>>
        ]
Annotation\Model.cpp(40): note: see reference to class template instantiation 'boost::multi_index::multi_index_container<std::shared_ptr<const C2>,boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::tag<C1,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<const C2,boost::multi_index::const_mem_fun<C2,C1,C1 C2::f2(void) const>,boost::multi_index::member<C2,const uint32_t,pointer-to-member(0x0)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::mpl::na>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>>' being compiled
        with
        [
            Value=std::shared_ptr<const C2>
        ]

查看报告的行

// *** this earlier one has ⋯const C2>&⋯ where the error claims the problem lies.
result_type operator()(const reference_wrapper<const value_type>& x)const
{
  return result_type(*this,x.get());
}

result_type operator()(const reference_wrapper<value_type>& x)const
{   // *** error points to this line, and value_type is C2, and the template parameter is =not= const C2.
  return result_type(*this,x.get());
}

这里发生了什么?这似乎是boost::multi_index_container的普通用法。

1 个答案:

答案 0 :(得分:3)

您的composite_key被错误地指定,它应该是

bmi::composite_key<
    C2,
    bmi::const_mem_fun< C2, C1, &C2::f2 >,
    bmi::member< C2, const uint32_t, &C2::xx1 >
>

即。在第一个参数中没有const限定符。另外,您可能需要查看Boost.MultiIndex文档中的this section,特别是倒数第二段。