有没有办法从C ++继承Boost多索引容器?

时间:2016-10-12 19:04:10

标签: c++ inheritance boost containers boost-multi-index

我正在寻找一种方法来创建一个继承boost多索引容器功能的基本容器类。我希望能够为此基类添加其他函数,并创建其他可以使用此基类函数的类,并使用boost的多索引容器。

我尝试过类似的事情:

template < class D, E >
class BoostModelContainer : public boost::multi_index_container<D, E>
{
public:
    D* AddItem( const D& item)
    {
        //code here
    }
};

然后创建继承基类的其他类,如:

class ExampleContainer : public BoostModelContainer< CItem,
boost::multi_index::indexed_by<
  boost::multi_index::ordered_unique< 
     boost::multi_index::tag<id_tag>, boost::multi_index::member< CItem, ItemId, &CItem::m_id > >,
  boost::multi_index::ordered_unique< 
     boost::multi_index::tag<name_tag>, boost::multi_index::member< CItem, String, &CItem::m_name > >
  >
>

但这不会编译。有没有人有任何其他想法或知道如何使这个工作?

谢谢!

2 个答案:

答案 0 :(得分:2)

您传递了两个模板参数,但您的模板只需要一个。

plus1

答案 1 :(得分:2)

如果没有minimal, complete and verifiable example,确切地知道你的问题有点困难。但是右边的答案肯定会指出你发布的代码的问题。基本上,您在class声明中缺少template个关键字:

template < class D, class E >
// missing ---------^^^^^
class BoostModelContainer : public boost::multi_index_container<D, E>
{ /* ... */ };

除此之外,它应该可以正常工作,因为以下完整的代码示例显示(compiles fine, see live demo):

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <string>

template <class D, class E>
class BoostModelContainer : public boost::multi_index_container<D, E>
{
public:
  D* AddItem( const D& item)
  {
    //code here
  }
};

struct Foo
{
  int id;
  std::string name;
};

struct id_tag { };
struct name_tag { };

// Requires -std=c++11    
using ExampleContainer = BoostModelContainer<
  Foo,
  boost::multi_index::indexed_by<
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<id_tag>, boost::multi_index::member<Foo, int, &Foo::id> >,
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<name_tag>, boost::multi_index::member<Foo, std::string, &Foo::name> >
    >
  >;

// works with c++03 as well
struct ExampleContainer2 : public BoostModelContainer<
  Foo,
  boost::multi_index::indexed_by<
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<id_tag>, boost::multi_index::member<Foo, int, &Foo::id> >,
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<name_tag>, boost::multi_index::member<Foo, std::string, &Foo::name> >
    >
  >
{ };

int main()
{
  ExampleContainer ec1;
  ExampleContainer2 ec2;
}