模板特化和模板模板参数的问题

时间:2010-09-26 02:27:01

标签: c++ templates template-specialization

我有一个班级Helper

template <typename T, template <typename> E>
class Helper {
    ...
};

我有另一个类模板Exposure,它将Helper继承,同时将自身作为模板模板参数E传递。我还需要专门化Exposure。因此,我想写下面的内容:

template <>
class Exposure<int> : public Helper<int, Exposure> {
    Exposure() : Helper<int, Exposure>() {
        ...
    };
    ...
};

不幸的是,这不会编译。 gcc抱怨道:

  

Exposure.h:170:错误:模板参数列表中参数2的类型/值不匹配“模板&gt; class ExposureHelper'

     

Exposure.h:170:错误:预期类型''的常量,得到'曝光'

我做错了吗?对于我正在尝试做的事情,是否有解决方法?

2 个答案:

答案 0 :(得分:2)

如果你真的想传递模板而不是类

template <typename T, template<typename> class E>
class Helper {
};

template <typename T>
class Exposure;

template <>
class Exposure<int> : public Helper<int, Exposure > {
};

或者如果您的意图不同

template <typename T, typename E>
class Helper {
};

template <typename T>
class Exposure;

template <>
class Exposure<int> : public Helper<int, Exposure<int> > {
};

答案 1 :(得分:0)

在Helper的第一个模板中,您不需要说第二个参数是模板:

template <typename T, typename E>
class Helper {
    ...
};

你可以用模板作为参数声明一个:

Helper<vector<int>, vector<char> > h;

但在第二个模板中,您有一个循环定义。您的Exposure课程取决于您的Exposure课程。这将创建一个循环引用,Helper类需要先定义Exposure才能继承Exposure。您可能需要重新构建课程。