我收到错误NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "vtable for Algorithm2A"
。我想我的基类中的问题我将该函数声明为纯虚函数,然后在派生类的头.h
中重新声明它,以便能够在实现文件.cpp
中实现它。
IAlgorithm2.h - 这是我的抽象类
#include "IAlgorithm1.h"
//! Algorithm2 interface
class IAlgorithm2 {
public:
~IAlgorithm2() {
}
virtual std::vector<int> calculateLCP(std::string BWT)=0;
};
现在,我已在Algorithm2.h
和Algorithm2.cpp
中实现此功能。
Algorithm2A.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);
};
Algorithm2A.cpp
#include "Algorithm2A.hpp"
std::vector<int> Algorithm2A::calculateLCP(std::string BWT) {
// implementation of this
}
应该怎么做?如果我从Algorithm2A.h
删除了它不会编译的定义,如果我把它留在那里,那么就会出现vtable问题。
修改:这不是模板问题
IAlgorithm1.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 */
Algorithm1A.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
答案 0 :(得分:0)
缺少vtable通常意味着第一个非内联虚拟成员函数没有定义
错误消息告诉您出了什么问题! # update my local repo with all the data from the remote server
git fetch --all --prune
中的第一个非内联虚拟成员函数未定义!
由于您目前的第一个此类函数是IAlgorithm2
,并且您实际上并不希望来定义它,因此常见的解决方法是为calculateLCP
提供虚拟析构函数(无论如何你应该做什么),用一个空的定义。
您还需要为您声明的IAlgorithm2
提供定义,或删除该声明。