【问题标题】:Non-type template inheritance from template linking error来自模板链接错误的非类型模板继承
【发布时间】:2019-07-10 17:31:28
【问题描述】:

我有一个抽象类DataFormatter 作为一些接口。我有一个用于不同类型数据的派生模板DataFormatterTemplate。在这里,我覆盖了纯虚函数并为Process() 方法添加了专门化。现在我想使用长度不同的数据类型INT。因此,使用带有非类型参数INT<val> 的模板的想法。我想为我的特殊数据类型使用从DataFormatterTemplateDataFormatterTemplatePartial 派生的方法,现在我试图为不同的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()'

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

【问题讨论】:

  • @drescherjm 可能已经解决了这个问题,但我不能确定是否足以解决这个问题。请提供minimal reproducible example
  • @drescherjm,这不是解决方案。现在我可以将问题重新表述为“为什么链接器尝试在派生的DataFormatterTemplatePartialDataFormatterTemplate 类中查找专业化?我已经用小例子编辑了这个问题。

标签: c++ templates inheritance template-specialization


【解决方案1】:

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

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 */ }
};

【讨论】:

  • 纯虚函数不适合我,但默认实现是缺少的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多