2010-07-09 58 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: 
}; 

编译没有继承就好了,所以我相当肯定不能看声明和模板的定义。任何人对我可能出错的地方以及我能做些什么都有什么建议?我应该在Infector定义之前使用extern让编译器知道Counter模板还是类似的东西?

干杯,

凯尔

+2

您是否记得包含定义计数器的文件(即#include“Counter.h”)? – 2010-07-09 20:29:15

+2

您将不得不发布您看到的错误消息。我们在这里不是精神病。 – sbi 2010-07-09 20:37:32

+1

另外,你使用什么编译器? CRTP会严重影响一些较老的编译器。如果你仍然使用GCC 3.4(MinGW最近只是最近拿到了GCC 4的最新版本,4.4版本),那么你可能会遇到问题。我可能是混合版本,但我认为我在编译器中做了无限循环,在MinGW GCC 3.4.5 – Steve314 2010-07-09 20:52:41

回答

2

我注意到你特别提到的声明和定义。
你有他们在单独的文件?

如果是这样,模板是只有头部的生物。你需要把你的定义放在头文件中。

+0

啊,真棒。非常感谢。我将模板移动到一个头文件,我把它作为一个链接的目标文件,我认为这对剩下的代码来说是不够的。干杯。 – 2010-07-12 13:56:19