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:
};

没有继承,一切都编译得很好,所以我很确定它看不到模板的声明和定义。有人对我可能出错的地方以及我能做些什么有任何建议吗?我应该在我的 Infector 定义之前使用 extern 来让编译器知道 Counter 模板或类似的东西吗?

干杯,

凯尔

4

1 回答 1

2

我注意到您特别提到了声明和定义。
您是否将它们放在单独的文件中?

如果是这样,模板是只有标题的生物。您需要将定义放在头文件中。

于 2010-07-09T20:39:36.457 回答