2016-10-12 10 views
-1

부스트 다중 인덱스 컨테이너의 기능을 상속하는 기본 컨테이너 클래스를 만드는 방법을 찾고 있습니다. 이 기본 클래스에 다른 함수를 추가하고이 기본 클래스의 함수를 사용하고 부스트의 다중 인덱스 컨테이너를 사용할 수있는 다른 클래스를 만들 수 있기를 원합니다. C++에서 Boost multi index 컨테이너를 상속하는 방법이 있습니까?

내가 좋아하는 뭔가를 시도 :

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없이 정확히 파악하기 조금 어렵다. 하지만 rightfold의 대답은 확실히 코드에 문제가 있음을 지적합니다. 기본적으로 당신은 당신의 template 선언에 class 키워드 누락 : 그 외에도

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

문제는 코드의 다른 곳에서 끝났습니다! –