2016-10-12 8 views
-1

Я ищу способ создания базового класса контейнера, который наследует функциональность контейнера с несколькими индексами boost. Я хочу иметь возможность добавлять другие функции в этот базовый класс и создавать другие классы, которые могут использовать функции этого базового класса и использовать мультииндексный контейнер boost.Есть ли способ наследовать от Boost multi index container в C++?

Я пытался что-то вроде:

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 > > 
    > 
> 

Но это не компилируется. Кто-нибудь есть какие-то другие идеи или знает, как заставить это работать?

спасибо !!

+1

Дон» достаточно знать ваш конкретный случай, но я все равно останусь здесь: [Предпочитаете композицию над наследованием?] (http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) – user4581301

+1

Я не знаю думаю, композиция будет работать? Я пытаюсь создать множество различных контейнеров с различными структурами с несколькими индексами. И я хочу, чтобы все контейнеры имели доступ к базовым функциям, а не помещали функции в каждый из контейнеров. И я хочу, чтобы каждый контейнер был контейнером с несколькими индексами. –

+1

Это просто комментарий «Рассмотрите свои альтернативы». В этом вопросе недостаточно, чтобы сделать хороший вызов так или иначе. Иногда наследование из контейнера подходит, но обычно это не так. – user4581301

ответ

2

Вы передаете два аргумента шаблона, но ваш шаблон принимает только один.

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

Все еще не компилируется с дополнительным аргументом шаблона. Я получаю эту ошибку: –

+0

D: \ Code \ boost \ boost_1_62_0 \ boost/mpl/aux_/has_begin.hpp (20): ошибка C2988: объявление/определение нераспознаваемого шаблона –

+0

Спасибо, что проблема оказалась в другом месте в коде! –

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; 
} 
+0

Спасибо, что проблема оказалась в другом месте в коде! –