2010-07-09 56 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