我是一個非常新手(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模板還是類似的東西?
乾杯,
凱爾
您是否記得包含定義計數器的文件(即#include「Counter.h」)? – 2010-07-09 20:29:15
您將不得不發佈您看到的錯誤消息。我們在這裏不是精神病。 – sbi 2010-07-09 20:37:32
另外,你使用什麼編譯器? CRTP會嚴重影響一些較老的編譯器。如果你仍然使用GCC 3.4(MinGW最近只是最近拿到了GCC 4的最新版本,4.4版本),那麼你可能會遇到問題。我可能是混合版本,但我認爲我在編譯器中做了無限循環,在MinGW GCC 3.4.5 – Steve314 2010-07-09 20:52:41