我正在寻找一种方法来创建一个继承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 > >
>
>
但这不会编译。有没有人有任何其他想法或知道如何使这个工作?
谢谢!
答案 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;
}