我的目标是创建一个基类,以及一个包含static vector
的CRTP子库类,它将为每个Derived类保存不同的值。但是,派生类中的每个对象必须只能看到整个类的一个vector
。此外,我需要通过一个通用接口来操作这个vector
,这就是我设置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 :(得分:1)
会员
template <>
vector<long int> subSeq<Fibonnacci>::memory;
应该在某处定义。为了达到理想的结果,您应该只在一个翻译单元(cpp文件)中自己明确地执行此操作。
或者;
template <class T>
vector<long int> subSeq<T>::memory = {};
由于某些编译器支持公共数据折叠(例如msvc中的COMDAT),如果您希望使用隐式实例化,这可能会有所帮助,请注意此answer for more detail on common symbols。