非类型模板从模板链接错误继承

时间:2019-07-10 17:31:28

标签: c++ templates inheritance template-specialization

我有一个抽象类DataFormatter作为某些接口。我有一个用于不同类型数据的派生模板DataFormatterTemplate。在这里,我重写了纯虚函数,并为Process()方法添加了特殊化。现在,我想使用长度可能不同的数据类型INT。因此,使用一个带有非类型参数INT<val>的模板的想法。我想使用来自DataFormatterTemplateDataFormatterTemplatePartial的派生类来处理特殊的数据类型,现在我试图为不同的Process()覆盖val方法,但是有未定义的引用错误。

出什么问题了?

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()'

如您所见,链接器试图在基类中找到Process()专业化,但不想使用派生。

1 个答案:

答案 0 :(得分:0)

即使您没有使用Process()的{​​{1}}方法,也应该给它一个定义或将其标记为纯虚拟的。

DataFormatterTemplate