Я просто программист (C++) и только что открыл CRTP для хранения количества объектов, принадлежащих к определенному классу.Использование «любопытно повторяющегося шаблона шаблона» в многофайловой программе
Я реализовал это следующим образом:
template <typename T>
struct Counter
{
Counter();
virtual ~Counter();
static int count;
};
template <typename T> Counter<T>::Counter()
{
++count;
}
template <typename T> Counter<T>::~Counter()
{
--count;
}
template <typename T> int Counter<T>::count(0);
, который, кажется, работает. Однако, это, кажется, не нравится унаследовав от него в отдельный файл заголовка, в котором я заявил об этом:
class Infector : public Counter<Infector>
{
public:
Infector();
virtual ~Infector();
virtual void infect(Infectee target);
virtual void replicate() = 0;
virtual void transmit() = 0;
protected:
private:
};
Все компилируется нормально без наследования, так что я достаточно уверен, что это не может видеть объявление и определение шаблона. У кого-нибудь есть предложения относительно того, где я могу ошибаться и что я могу с этим поделать? Должен ли я использовать extern перед определением Infector, чтобы компилятор знал о шаблоне Counter или что-то в этом роде?
Приветствия,
Kyle
Вы не забыли указать файл, определяющий счетчик (т. Е. #include "Counter.h")? –
Вам нужно будет опубликовать сообщения об ошибках, которые вы видите. Мы здесь не психические. – sbi
Кроме того, какой компилятор вы используете? CRTP может серьезно расстроить некоторые старые компиляторы. Если вы все еще используете GCC 3.4 (MinGW только окончательно опустил GCC 4 относительно недавно, с версией 4.4), у вас могут возникнуть проблемы из-за этого. Я мог бы смешивать версии, но я думаю, что у меня были бесконечные циклы в компиляторе, которые делали подобные трюки шаблонов в MinGW GCC 3.4.5 – Steve314