2012-06-30 4 views
1

Я думаю об использовании любопытно повторяющегося шаблона шаблона для моего приложения. Тем не менее, я хотел бы, чтобы классы работали с определенными пользователем типами. Я хотел бы понять, если это возможно, чтобы создать структуру, подобную той, как показано ниже:Любопытно повторяющиеся шаблоны с шаблонами листьев шаблона

template <class T_leaftype> 
class BaseTrajectoryPoint { 
}; 


template <class MyType> 
class MyTrajectoryPoint: public BaseTrajectoryPoint<MyTrajectoryPoint> { 
    private:  
     MyType A; 
}; 

Код выше не компилировать со следующей ошибкой:

type/value mismatch at argument 1 in template parameter list for ‘template class BaseTrajectoryPoint’

Существуют ли какие-либо альтернативные способы о приближении проблемы? Я хотел бы использовать статический полиморфизм, но я бы предпочел определить все возможные методы в базовом классе.

ответ

5
template <class T_leaftype> 
class BaseTrajectoryPoint { 
}; 


template <class MyType> 
class MyTrajectoryPoint: public BaseTrajectoryPoint<MyTrajectoryPoint<MyType> > { 
    private:  
     MyType A; 
}; 

MyTrajectoryPoint не тип, его шаблон; когда вы передаете его в качестве параметра шаблона, это выглядит как template<typename> class T>, а не template<class T> - и последнее, что ожидает ваш базовый класс. Но MyTrajectoryPoint<MyType> называет тип, поэтому вы можете использовать его в качестве параметра шаблона вашего базового класса.

Конечно, вы можете изменить декларацию BaseTrajectoryPoint в template<template<class> class T_leaftype>, но тогда вы бы иметь использовать шаблон класса в качестве параметра шаблона, никогда не полного типа.

0

Что наш друг Griwes сказал правильно, хотя, если вы знаете, что каждый класс, который будет наследовать BaseTrajectoryPoint шаблонного класса, вы можете сделать следующее:

template<template <class> class TLeaf> // << This means: It is expected a template class as parameter 
class BaseTrajectoryPoint{ 
}; 

template <class MyType> 
class MyTrajectoryPoint: public BaseTrajectoryPoint<MyTrajectoryPoint> >{ 
    private: 
     MyType A; 
};