模板参数名称作为基类

时间:2013-04-01 15:40:05

标签: c++ templates

我有以下几种类型:

typedef unsigned int uint32;

typedef void* ptr;

struct memory_options {};

struct memory_provider {};

template <typename options>
struct memory_track {};

template <typename options>
struct no_memory_track : public memory_track<options> {};

template<typename options>
struct defrag_memory_track : public memory_track<options> {};

template<typename options>
struct full_memory_track : public memory_track<options> {};

template <typename options, typename prov, typename track>
struct memory_algorithm : public track < options > {};

int main()
{
}

此类型用于定义自定义内存管理器。

问题是,类memory_algorithm将继承自另一个类,该类将始终采用代表template parameter类的memory_options,我称之为options。基类可以是来自memory_track的部分特化或来自它的子类,所以在memory_algorithm我传递了2个模板参数,一个代表类名 - 即track - 另一个代表memory_options类 - 即options - 现在每当我尝试使用GCC和Visual C ++ 2008使用样本测试单元编译代码时,我都会收到错误:

用于visual c ++:

  

在'&lt;'

之前缺少','      

参见正在编译的类模板实例化'memory_algorithm'的引用

海湾合作委员会

  

错误:'&lt;'之前的预期模板名称令牌

     

错误:在'&lt;'之前预期'{'令牌

     

错误:在'&lt;'之前预期的unqualified-id令牌

问题是什么以及如何解决?

1 个答案:

答案 0 :(得分:4)

如果我正确理解了您的问题,您需要的是使track成为模板模板参数,而不是常规类型参数:

template <typename options, typename prov, template<typename> class track> 
//                                         ^^^^^^^^^^^^^^^^^^^^^^^^
struct memory_algorithm : public track < options > {};