2013-04-01 107 views
3

我有以下几种类型:模板参数名称作为基类

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会从另一个类继承,该类公司将始终以代表memory_optionstemplate parameter,我把它叫做options。基类可以是从memory_track或从它的子类的部分专业化,所以在memory_algorithm我传递了2个模板参数,一个代表类名 - 即track - 另一个代表memory_options类 - 即options - 现在无论何时我试图编译使用GCC和Visual C++ 2008与样本测试装置的代码我得到了错误:

为Visual C++:

missing ',' before '<'

see reference to class template instantiation 'memory_algorithm' being compiled

为GCC:

error: expected template-name before '<' token

error: expected '{' before '<' token

error: expected unqualified-id before '<' token

什么问题以及如何解决?

+0

如果将是非常有用的点线(S )发生错误。 – user93353

回答

4

如果我理解正确的话你的问题,你需要什么是可能使track一个模板的模板参数,而不是一个常规类型参数:

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

你可以指点我在C++ 03标准里面讨论这个问题的位置吗? –

+0

@Muhammadalaa:在C++ 03中,它是第14.3.3节。但是请记住,标准技术性很强,有时难以阅读。你可以考虑一本书。 –