Использование «любопытно повторяющегося шаблона» в многофайловой программе - PullRequest
0 голосов
/ 10 июля 2010

Я довольно начинающий программист (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 или что-то в этом роде?

Cheers,

Kyle

1 Ответ

2 голосов
/ 10 июля 2010

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

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

...