2016-01-09 1 views
-1

Я получаю ошибку NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "vtable for Algorithm2A". Я предполагаю, что проблема в моем базовом классе я объявила эту функцию как чистую виртуальную, а затем в заголовке .h производного класса I обновила его, чтобы иметь возможность реализовать его в файле реализации .cpp.Отсутствует vtable: должна ли отображаться виртуальная функция в заголовочном файле?

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

+1

Вам нужно повторить объявление функции в 'Algorithm2A'. Что такое проблема vtable? Любые сообщения об ошибках? Обратите внимание, что файл заголовка называется 'Algorithm2A.h', но вы' #include '. Обратите внимание на 'pp' в конце. – BoBTFish

+0

неопределенные символы для архитектуры x86_64: "Algorithm2A :: ~ Algorithm2A()", ссылочные от: _MAIN в главном-ccca0a.o "для Algorithm1A виртуальные таблицы", ссылочные от: _MAIN в главном-ccca0a.o, и там является ПРИМЕЧАНИЕ. Я отредактирую и дам также код алгоритма1A. – Whizzil

+1

Как вы его строите? Похоже, вы все не связали. –

ответ

1

недостающее обычно означает виртуальные таблицы первым не-рядный виртуальная функция-член не имеет определения

Сообщение об ошибке говорит вам, что это неправильно! Первая не-встроенная функция виртуального члена в IAlgorithm2 не определена!

Поскольку ваша первая такая функция в настоящее время является calculateLCP, и вы на самом деле не хотят определить его, общее исправление, чтобы дать IAlgorithm2 виртуальный деструктор (который вы должны делать в любом случае), с пустым определением ,

Вам также необходимо предоставить определение для Algorithm2A::~Algorithm2A, которое вы объявили или удалили это объявление.

+0

Я сделал так, как вы сказали, и имел следующую проблему: Неопределенные символы для архитектуры x86_64: «vtable for Algorithm1A», на который ссылаются: _main в main-b98ecb.o ПРИМЕЧАНИЕ. Отсутствующая версия vtable обычно означает первый нестрочный виртуальный функция-член не имеет определения. "vtable for Algorithm2A", ссылка от: _main в main-b98ecb.o – Whizzil

+0

@Whizzil: И что такое '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+0

Посмотрите, пожалуйста, мое редактирование. Файл «IAlgorithm2.h» – Whizzil