我有一些可在 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 { };
我正在使用针对 x86(32 位)的 VS2015。
完整的错误是:
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
.