缺少vtable:是否应该在头文件中重新声明虚拟函数

Missing vtable: should virtual function be redeclared in header file?

本文关键字:新声明 声明 函数 虚拟 文件 是否 vtable 缺少      更新时间:2023-10-16

我收到错误NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "vtable for Algorithm2A"。我假设我的基类中的问题是,我将函数声明为纯虚拟的,然后在派生类的头.h中我重新声明了它,以便能够在实现文件.cpp中实现它。

IAlgorith2.h——这是我的抽象类

#include "IAlgorithm1.h"
//! Algorithm2 interface
class IAlgorithm2 {
public:
    ~IAlgorithm2() {
    }
    virtual std::vector<int> calculateLCP(std::string BWT)=0;
};

现在,我已经在Algorithm2.hAlgorithm2.cpp中实现了这一点。

算法2A.hpp

class Algorithm2A : public IAlgorithm2 {
protected:
    IAlgorithm1 &algorithm1;
    std::vector<Interval> getIntervals(int i, int j) {
        return algorithm1.getIntervals(i, j);
    }
public:
    Algorithm2A(IAlgorithm1 &a) : algorithm1(a) {
    }
    std::vector<int> calculateLCP(std::string BWT);
};

算法2A.cpp

#include "Algorithm2A.hpp"

std::vector<int> Algorithm2A::calculateLCP(std::string BWT) {
    // implementation of this
}

应该如何做到这一点?如果我从Algorithm2A.h中删除它不会编译的定义,如果我把它留在那里,那么就会出现vtable问题。

编辑:这不是模板的问题

IAlgorith1.h

//! Algorithm1 interface
class IAlgorithm1 {
protected:
    virtual std::string uniqueCharsInInterval(int i, int j)=0;

public:
    ~IAlgorithm1() {
    }
    virtual std::vector<Interval> getIntervals(int i, int j)=0;
};
#endif /* Algorithm1_h */

算法1A.h

#include "IAlgorithm1.h"
class Algorithm1A : public IAlgorithm1 {
protected:
    IRank &rank;
    OrderedAlphabet &alphabet;
    std::map<symbol_type, occurence_type> &C;
    std::string &BWT;
public:
        Algorithm1A(IRank &r,
                   OrderedAlphabet &a,
                   std::map<symbol_type, occurence_type> &c,
                   std::string &bwt):
                   rank(r), alphabet(a), C(c), BWT(bwt) {
        }
std::string uniqueCharsInInterval(int i, int j);

还有一个实现文件Algorithm1A.cpp

缺少vtable通常意味着第一个非内联虚拟成员函数没有定义

错误消息告诉你出了什么问题!IAlgorithm2中的第一个非内联虚拟成员函数未定义!

由于您目前的第一个此类函数是calculateLCP,并且实际上并不希望定义它,因此常见的解决方案是为IAlgorithm2提供一个虚拟析构函数(无论如何都应该这样做),并使用一个空定义。

您还需要为已声明的Algorithm2A::~Algorithm2A提供一个定义,或者删除该声明。