2016-05-05 2 views
0

У меня есть класс:«пропавших без вести виртуальные таблицы» для деструктора, но деструктор определяется

class Optimizer { 
    public: 
     Optimizer(mongoc_client_t *dbClient, std::string strategyName, std::string symbol, int group); 
     virtual ~Optimizer() = 0; 

и ее реализации:

#include "optimizers/optimizer.h" 

Optimizer::Optimizer(mongoc_client_t *dbClient, std::string strategyName, std::string symbol, int group) { 
    // ... 
} 

Optimizer::~Optimizer() { 
    free(data); 
} 

Но я получаю следующее сообщение об ошибке, казалось бы, связанные с деструктор быть неопределенным :

Undefined symbols for architecture x86_64: 
    "typeinfo for Optimizer", referenced from: 
     typeinfo for ReversalsOptimizer in reversalsOptimizer.o 
    "vtable for Optimizer", referenced from: 
     Optimizer::Optimizer(_mongoc_client_t*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int) in optimizer.o 
     Optimizer::~Optimizer() in optimizer.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [prepareData] Error 1 

Что я делаю неправильно? Полное определение заголовка - here, а реализация - here.

Я также попытался сделать деструктор не виртуальным, но это не поможет.

+3

Значит, вы сделали его чистым виртуальным и обеспечили реализацию? –

+1

Пожалуйста, отредактируйте ваше сообщение и включите [mcve]. –

+0

Я видел в других сообщениях StackOverflow, что это приемлемо. Но опять же, я также попытался сделать его не чистым виртуальным. –

ответ

2

Проблема заключается в том, что именно говорит сообщение об ошибке:

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

В частности, вы объявили и званых, но никогда не определял эту функцию:

virtual void prepareStudies(); 
0

Оказывается, что делает другие виртуальные функции в классе Optimizer быть чисто виртуальные функции решить эту проблему.

Смежные вопросы