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

Posted

技术标签:

【中文标题】模板特化和模板模板参数的问题【英文标题】:Problem with template specialization and template template parameters 【发布时间】:2010-09-26 02:27:00 【问题描述】:

我有一堂课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: 错误:“模板 > 类 ExposureHelper”的模板参数列表中参数 2 的类型/值不匹配

Exposure.h:170: 错误:期望一个''类型的常量,得到'Exposure'

我做错了吗?我正在尝试做的事情有解决方法吗?

【问题讨论】:

【参考方案1】:

如果你真的想传递 template 而不是 class

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> > 
;

【讨论】:

【参考方案2】:

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

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

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

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

但是在您的第二个模板中,您有一个循环定义。您的 Exposure 等级取决于您的 Exposure 等级。这会创建一个循环引用,Helper 类需要先定义 Exposure,然后才能从 Exposure 继承。你可能需要重组你的类。

【讨论】:

以上是关于模板特化和模板模板参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板进阶(非类型模板参数类模板的特化和模板的分离编译)

C++模板进阶操作 —— 非类型模板参数模板的特化以及模板的分离编译

函数模板参数包后跟模板参数和特化

根据模板模板参数采用的参数数量,部分特化模板的语法是啥?