2010-01-28 19 views
2

因此我有一个提升多索引容器。你可以看到,通过这个设计,我用来创建这个容器的每个对象都必须有一个成员函数返回一个名字为“name”的字符串。模板化成员函数来提升多索引容器

这显然不理想。我尝试了几个传递的“钥匙”的方式,但我不能让任何人来工作..

我想这个..

using namespace boost::multi_index; 
template < typename O, typename KT, typename KM > 
class Container 
{ 
public: 
    multi_index_container< 
     O, 
     indexed_by< 
      ordered_unique< 
       const_mem_fun< O, KT, &KM > 
      > 
     > 
    > _container; 
}; 

int main(int c, char *v[]) 
{ 
    Container< Object, std::string, Object::name > container; 
} 

,但没有喜悦..

编译器抱怨Object :: name不是一个类型,但我不知道如何解决这个问题。即使我研究如何为模板提供一个类型,我仍然需要一个具体的“Object :: name”实例来供容器使用。

也许我必须交出类型然后在建设中的成员函数?但那我该如何构造容器......我的头疼!

阿列克西,下面,请提供该解决方案

using namespace boost::multi_index; 
template < typename O, typename KT, KT (O::* KM)() > 
class Container 
{ 
public: 
    multi_index_container< 
     O, 
     indexed_by< 
      ordered_unique< 
       const_mem_fun< O, KT, KM > 
      > 
     > 
    > _container; 
}; 

int main(int c, char *v[]) 
{ 
    Container< Object, std::string, &Object::name > container; // <<---- ERROR HERE 
} 

然而,这produded以下编译器错误。

Template parameter KM requires an expression of type std::string (Object::*)(). 

在标线..

确定。事实证明,这是我的错,因为提交了一个错误签名的“& Object :: name”参数...我已经修复了这个问题..

+0

您可能会考虑为您的模板参数找到一个名称,该名称有点难以与数字文字混淆。 – 2010-01-28 09:39:13

+0

嗨大卫,我同意。我只为我的例子选择了这些参数。 Alexey, – ScaryAardvark 2010-01-28 12:51:40

回答

2

更改类定义。

template < typename O, typename KT, KT (O::* KM)() > 
class Container 
//... 

,并使用KM代替&KM

+0

。这几乎工作..我现在得到一个不同的错误。我用你的例子编辑了我的帖子,以显示错误。 – ScaryAardvark 2010-01-28 09:01:35

+0

Alexy ..我不应该怀疑你..我收到的编译器错误是由于容器中使用的对象有错误的签名...... – ScaryAardvark 2010-01-28 09:05:46