6

有没有办法获得递归模板类型?我有一个容器,我想为其指定底层存储策略。然而,内部模板必须使用外部模板的类型,因此它会导致类型定义中的循环——这是无法指定的。

关于我想要的:

template<typename C>
struct inner {
    C * object[16];
};

template<typename T, typename Inner>
struct container {
    T value;
    Inner<container> holder;
};

C++11 解决方案很好(尽管我仍在使用 gcc 4.6.3)。

4

2 回答 2

5

您需要告诉编译器这Inner是一个模板类:

template<typename T, template<typename> class Inner>
struct container {
    T value;
    Inner<container> holder;
};
于 2013-07-30T12:51:17.833 回答
0

我不确定您为什么要添加Inner类型模板参数,因为您要定义holder为基于Containerand的类型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总是根据 定义holderinner这有助于在定义时摆脱额外的模板参数Container。希望这会有所帮助:)

于 2013-07-30T14:32:28.133 回答