2014-11-15 12 views
1

我的目標是創建一個基類,以及一個包含static vector的CRTP子類,它將爲每個Derived類保存不同的值。但是派生類中的每個對象必須只能看到整個類的一個vector。此外,我需要通過一個通用接口來操縱這個vector,這就是爲什麼我要設置一個Base類。實現CRTP併發布「未定義參考」

Base類和基層

class Seq { 
public: 
    virtual unsigned long int elem(int i) = 0; 
    virtual void print(ostream& os) =0; // print out to a ostream 
    virtual int length() const =0;// return size of vector 
    virtual ~Seq() {} 
protected: 
    virtual void gen_elems(int i) = 0; //generates elements 
}; 

template<class T> 
class subSeq: public Seq { 
public: 
    unsigned long int elem(int i); 
    void print(ostream& os); 
    int length() const {return (int)memory.size();} 
    virtual ~subSeq() {} 
protected: 
    static vector<long int> memory; 
    virtual void gen_elems(int i) = 0; 
}; 

template<class T> 
void subSeq<T>::print(ostream& os) { 
    if((int)memory.size() != 0) { 
     cout << "Stored numbers: "; 
     for(int i=0; i<(int)memory.size(); i++) { 
      os << memory[i] << " "; 
     } 
     cout << "\n"; 
    } else { 
     cout << "Empty class!!\n"; 
    } 
} 

template<class T> 
unsigned long int subSeq<T>::elem(int i) { 
    if(i>=(int)memory.size()) gen_elems(i); 
    return memory[i]; 
} 

我的一個派生類:

class Fibonnacci: public subSeq<Fibonnacci> { 
public: 
    Fibonnacci(int=0); 
    ~Fibonnacci() {} 
protected: 
    void gen_elems(int i); // Gera os elementos da série até o iésimo elemento (protected) 
}; 

及其實施:

Fibonnacci::Fibonnacci(int param) { if(param) gen_elems(param); } 

void Fibonnacci::gen_elems(int param) { 

    for(int i=(int)memory.size(); i<param; i++) { 
     if(i>1) memory.push_back((long int)memory[i-1]+memory[i-2]); 
     else memory.push_back(1); 
    } 

} 

圍繞這條線出現問題

if(i>1) memory.push_back((long int)memory[i-1]+memory[i-2]); 

編譯罵我

undefined reference to `subSeq<Fibonnacci>::memory' 

這已經持​​續了幾個小時,因爲我是新來的概念CRTP,我看我不明白它做好,需要的人更有能力幫助比我(如何,如何。

有人能告訴我問題是什麼嗎?

+0

更新:如果我從CRTP一切切出的靜態工作正常,但後來每個派生類對象都將有自己的向量內存,它打破了我的目標 – GChamon

+1

成員'模板<>矢量 SUBSEQ ::內存;'應該在某處定義。爲了達到你想要的結果,你應該只在一個單獨的翻譯單元(cpp文件)中明確地做到這一點。如果你想使用隱式實例化,請注意這個答案,以獲取有關常見符號的更多詳細信息http://stackoverflow.com/a/16005504/3747990 – Niall

+1

酷! template vector subSeq :: memory = {}; 工作正常,而且看起來我達到了結果。我很不確定如何定義矢量,但它的工作原理。你會添加評論作爲答案,或者我應該這樣做嗎? – GChamon

回答

1

的構件

template <> 
vector<long int> subSeq<Fibonnacci>::memory; 

應某處定義。爲了達到你想要的結果,你應該只在一個單獨的翻譯單元(cpp文件)中明確地做到這一點。

或者,

template <class T> 
vector<long int> subSeq<T>::memory = {}; 

由於一些編譯器都支持常見的摺疊式數據(例如COMDAT在MSVC)如果你想使用隱式實例,注意,這個answer for more detail on common symbols這可能會有幫助。

+0

感謝您的編輯。我不是母語爲英語的人,有時我會犯這樣可怕的錯誤。另外,我仍然在使用堆棧溢出的問題。 – GChamon

+0

@GChamon,沒問題。你的問題有一個很好的轉折 – Niall