2017-06-01 6 views
1

Lassen Sie uns sagen, dass wir Basisklasse TabelleIst es möglich, vererben Template Klasse C++ spezialisiert auf sich

template <typename T> 
class Table 
{ 
public: 
    Table(); 
    virtual ~Table() = default; 
private: 
// get all column names as list 
virtual std::list<std::string> getAllColumnsImpl(); 
}; 

und ich will erben Testtable-Klasse und überschreiben Methode getAllColumnsImpl von Basisklasse:

class TestTable : 
public Table<TestTable> 
{ 
public: 
TestTable(); 
virtual ~TestTable() = default; 

std::string Description; 
int Count; 


private: 
// get all column names as list 
std::list<std::string> getAllColumnsImpl() override; 
}; 

Ist es überhaupt möglich?

Zum Beispiel habe ich Linkerfehler wie:

error LNK2019: unresolved external symbol "public: __cdecl Table<class TestTable>::Table<class TestTable>(void)" ([email protected]@@@@[email protected]) referenced in function "public: __cdecl TestTable::TestTable(void)" ([email protected]@[email protected]) 
+0

Sie können private Memberfunktionen nicht überschreiben, sie müssen "geschützt" sein. –

+0

@Someprogrammerdude - der gleiche Fehler ... – Alexander

+0

@Someprogrammerdude - Jason Lang geben Antwort, das ist genau CRTP - und meine Frage hat Antwort hier https://StackOverflow.com/Questions/4173254/what-is-the-curiously- Wiederholungs-Template-Muster-CRTP - aber ich wusste vorher nicht über CRPT - weil keine Informationen zu finden - möglicherweise kann meine Frage Menschen wie mich helfen ... – Alexander

Antwort

1

Sie können es tun, es heißt CRTP - die Merkwürdiger Recurring Template Parameter. Es ist sehr praktisch und es gibt viele Blogs und Ressourcen, die die Verwendung dafür erklären.

Der Fehler, den Sie bekommen, liegt daran, dass Sie die Funktionskörper der Vorlage in der Headerdatei der Vorlage haben müssen.

Jede cpp-Datei wird in eine separate Objektdatei kompiliert, und Vorlagen werden auf einer pro-cpp-Dateibasis aufgelöst. Wenn Sie Vorlagencode in eine cpp-Datei einfügen, dann ist es nur "Vorlage < T>" und der Compiler weiß nicht, was T ist, also wird kein Code generiert (es sei denn, es wird von der gleichen CPP-Datei mit einem tatsächlichen Typ angefordert und nicht T).

Allerdings weiß Ihre andere cpp-Datei, dass sie eine "Vorlage < TestTable>" will, aber sie hat keinen Zugriff auf den Code, der das funktioniert, weil das in der anderen cpp-Datei steckt, die nur weiß das generische "Template < T>". Keine cpp-Datei kann den fehlenden Code generieren, daher erhalten Sie den Linker-Fehler. Wenn Sie den gesamten Vorlagencode in die Header-Datei einfügen, wird das Problem behoben.

+0

Danke - ich habe zum Beispiel hier https://StackOverflow.com/questions/4173254/what-is-the-curiously-recurring-template-pattern-crtp erklärt – Alexander

Verwandte Themen