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

时间:2016-01-09 16:53:39

标签: c++ polymorphism header-files

我收到错误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.hAlgorithm2.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

1 个答案:

答案 0 :(得分:0)

  

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

错误消息告诉您出了什么问题! # update my local repo with all the data from the remote server git fetch --all --prune 中的第一个非内联虚拟成员函数未定义!

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

您还需要为您声明的IAlgorithm2提供定义,或删除该声明。