2010-07-09 2 views
0

Я просто программист (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

+2

Вы не забыли указать файл, определяющий счетчик (т. Е. #include "Counter.h")? –

+2

Вам нужно будет опубликовать сообщения об ошибках, которые вы видите. Мы здесь не психические. – sbi

+1

Кроме того, какой компилятор вы используете? CRTP может серьезно расстроить некоторые старые компиляторы. Если вы все еще используете GCC 3.4 (MinGW только окончательно опустил GCC 4 относительно недавно, с версией 4.4), у вас могут возникнуть проблемы из-за этого. Я мог бы смешивать версии, но я думаю, что у меня были бесконечные циклы в компиляторе, которые делали подобные трюки шаблонов в MinGW GCC 3.4.5 – Steve314

ответ

2

Я заметил, что вы конкретно упоминается заявления и определения.
Есть ли у вас их в отдельных файлах?

Если это так, шаблоны являются только создателями заголовка. Вам нужно будет поместить свои определения в файл заголовка.

+0

Ahh, удивительный. Большое спасибо. Я переведу шаблон в файл заголовка, я имел его как файл связанных объектов, который, как мне кажется, недостаточен для того, чтобы остальная часть кода знала об этом. Приветствия. –