2010-01-28 16 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