我不知道爲什麼你要添加的Inner
類型模板參數,因爲你定義holder
是一種類型的基於Container
和inner
,這兩者都可以在您聲明持有者的地方提供。
您打算使用struct inner
以外的任何其他類型作爲模板參數嗎?Container
?如果沒有,下面的簡化代碼編譯和VS2010跑了我:
#include <vector>
#include <stdio.h>
template <typename C>
struct inner{
C * objects[16];
bool hasobj;
inner():hasobj(false){}
};
template <typename T>
class Container {
inner<Container> holder;
T value;
public:
Container(const T& valueP){
value = valueP;
}
void AddChild(Container* rhs){
holder.objects[0] = rhs; //Always using first location, just for example
holder.hasobj = true;
}
void PrintStuff()const{
if(holder.hasobj){
holder.objects[0]->PrintStuff();
}
printf("VAL IS %d\n", value);
}
};
int main(){
Container<int> c(10);
Container<int> c1(20);
c1.AddChild(&c);
c1.PrintStuff();
}
基本上,這是假設container
總是在inner
來定義holder
,這有助於擺脫多餘的模板參數,當定義Container
。希望這有助於:) 阿倫
有一種叫做「好奇遞歸模板模式」(CRTP)的東西?也許它會幫助,不確定... http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – Jimbo
這種遞歸數據類型將有哪些新行爲將它與鏈接列表區分開來? – abiessu
@abiessu,我目前的用途實際上是基數樹。每個節點都有一個如何到達下一個節點的索引,「內部」是指定該索引的策略。也就是說,模板允許說明孩子是如何管理的,而不是固定的紅黑,散列或其他策略。 –