2016-05-05 10 views
0

Ich habe eine Klasse:"Missing VTable" für destructor, aber destructor definiert ist

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

und seine Umsetzung:

#include "optimizers/optimizer.h" 

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

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

aber ich bekomme die folgenden Fehler scheinbar im Zusammenhang mit dem Destruktor nicht definiert ist :

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 

Was mache ich falsch? Die vollständige Headerdefinition ist here und die Implementierung ist here.

Ich habe auch versucht, den Destruktor nicht virtuell, aber es hilft nicht.

+3

Sie haben es also rein virtuell gemacht und eine Implementierung bereitgestellt? –

+1

Bitte bearbeiten Sie Ihren Beitrag und fügen Sie einen [mcve] ein. –

+0

Ich sah in anderen StackOverflow-Posts, dass das akzeptabel ist. Aber ich habe auch versucht, es nicht rein virtuell zu machen. –

Antwort

2

Das Problem ist genau das, was die Fehlermeldung sagt:

HINWEIS: eine fehlende VTable bedeutet in der Regel die erste nicht-Inline virtuelle Member-Funktion hat keine Definition.

Insbesondere erklären Sie und nannten aber nie diese Funktion definiert:

virtual void prepareStudies(); 
0

Es stellt sich heraus, dass die anderen virtuellen Funktionen in der Optimizer Klasse macht rein virtuelle Funktionen wird das Problem gelöst.