我的目標是創建一個基類,以及一個包含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,我看我不明白它做好,需要的人更有能力幫助比我(如何,如何。
有人能告訴我問題是什麼嗎?
更新:如果我從CRTP一切切出的靜態工作正常,但後來每個派生類對象都將有自己的向量內存,它打破了我的目標 – GChamon
成員'模板<>矢量 SUBSEQ ::內存;'應該在某處定義。爲了達到你想要的結果,你應該只在一個單獨的翻譯單元(cpp文件)中明確地做到這一點。如果你想使用隱式實例化,請注意這個答案,以獲取有關常見符號的更多詳細信息http://stackoverflow.com/a/16005504/3747990 –
Niall
酷! template vector subSeq :: memory = {}; 工作正常,而且看起來我達到了結果。我很不確定如何定義矢量,但它的工作原理。你會添加評論作爲答案,或者我應該這樣做嗎? –
GChamon