来自模板链接错误的非类型模板继承
Non-type template inheritance from template linking error
我有一个抽象的 class DataFormatter
作为一些接口。我有一个用于不同类型数据的派生模板 DataFormatterTemplate
。在这里,我重写了纯虚函数并为 Process()
方法添加了特化。现在我想使用长度可以不同的数据类型 INT
。因此,使用一个带有非类型参数的模板的想法 INT<val>
。我想将派生自 DataFormatterTemplate
class DataFormatterTemplatePartial
用于我的特殊数据类型,现在我正在尝试为不同的 val
重写 Process()
方法,但是未定义的引用错误。
有什么问题吗?
template<unsigned val>
struct INT {
int data[val];
};
/**
* Data formatter base class
*/
class DataFormatter {
public:
DataFormatter() {};
virtual ~DataFormatter() {};
virtual void Process() = 0;
};
template<class OutFmt>
class DataFormatterTemplate : public DataFormatter {
public:
virtual ~DataFormatterTemplate() {};
virtual void Process();
};
template<>
void
DataFormatterTemplate<int>::Process() {}
template<unsigned filNum>
class DataFormatterTemplatePartial : public DataFormatterTemplate<INT<filNum>> {
public :
virtual void Process();
};
template<unsigned filNum>
void DataFormatterTemplatePartial<filNum>::Process() {
std::cout << filNum << std::endl;
}
int main() {
DataFormatterTemplatePartial<4> df;
DataFormatterTemplatePartial<3> df2;
df.Process();
df2.Process();
return 0;
}
链接错误:
CMakeFiles/dft_test.dir/main.cpp.o:(.data.rel.ro._ZTV21DataFormatterTemplateI3INTILj3EEE[_ZTV21DataFormatterTemplateI3INTILj3EEE]+0x20): undefined reference to `DataFormatterTemplate<INT<3u> >::Process()'
CMakeFiles/dft_test.dir/main.cpp.o:(.data.rel.ro._ZTV21DataFormatterTemplateI3INTILj4EEE[_ZTV21DataFormatterTemplateI3INTILj4EEE]+0x20): undefined reference to `DataFormatterTemplate<INT<4u> >::Process()'
如您所见,链接器试图在基 class 中找到 Process()
特化,但不想使用派生。
即使您没有使用过DataFormatterTemplate
的Process()
方法,您也应该给它一个定义或将其标记为纯虚拟。
template<class OutFmt>
class DataFormatterTemplate : public DataFormatter {
public:
virtual ~DataFormatterTemplate() {};
virtual void Process() = 0; // <- should be pure virtual function
// Or virtual void Process() { /* default behavior */ }
};
我有一个抽象的 class DataFormatter
作为一些接口。我有一个用于不同类型数据的派生模板 DataFormatterTemplate
。在这里,我重写了纯虚函数并为 Process()
方法添加了特化。现在我想使用长度可以不同的数据类型 INT
。因此,使用一个带有非类型参数的模板的想法 INT<val>
。我想将派生自 DataFormatterTemplate
class DataFormatterTemplatePartial
用于我的特殊数据类型,现在我正在尝试为不同的 val
重写 Process()
方法,但是未定义的引用错误。
有什么问题吗?
template<unsigned val>
struct INT {
int data[val];
};
/**
* Data formatter base class
*/
class DataFormatter {
public:
DataFormatter() {};
virtual ~DataFormatter() {};
virtual void Process() = 0;
};
template<class OutFmt>
class DataFormatterTemplate : public DataFormatter {
public:
virtual ~DataFormatterTemplate() {};
virtual void Process();
};
template<>
void
DataFormatterTemplate<int>::Process() {}
template<unsigned filNum>
class DataFormatterTemplatePartial : public DataFormatterTemplate<INT<filNum>> {
public :
virtual void Process();
};
template<unsigned filNum>
void DataFormatterTemplatePartial<filNum>::Process() {
std::cout << filNum << std::endl;
}
int main() {
DataFormatterTemplatePartial<4> df;
DataFormatterTemplatePartial<3> df2;
df.Process();
df2.Process();
return 0;
}
链接错误:
CMakeFiles/dft_test.dir/main.cpp.o:(.data.rel.ro._ZTV21DataFormatterTemplateI3INTILj3EEE[_ZTV21DataFormatterTemplateI3INTILj3EEE]+0x20): undefined reference to `DataFormatterTemplate<INT<3u> >::Process()'
CMakeFiles/dft_test.dir/main.cpp.o:(.data.rel.ro._ZTV21DataFormatterTemplateI3INTILj4EEE[_ZTV21DataFormatterTemplateI3INTILj4EEE]+0x20): undefined reference to `DataFormatterTemplate<INT<4u> >::Process()'
如您所见,链接器试图在基 class 中找到 Process()
特化,但不想使用派生。
即使您没有使用过DataFormatterTemplate
的Process()
方法,您也应该给它一个定义或将其标记为纯虚拟。
template<class OutFmt>
class DataFormatterTemplate : public DataFormatter {
public:
virtual ~DataFormatterTemplate() {};
virtual void Process() = 0; // <- should be pure virtual function
// Or virtual void Process() { /* default behavior */ }
};