komplizierte vererbung
-
//test.h class CObject { protected: static DWORD m_dwObjectSize; // size in bytes of all objects virtual void IncObjectSize() = 0; // increase the number of objects size virtual void DecObjectSize() = 0; // decrease the number of objects size public: CObject(){}; ~CObject(){}; }; template <typename T> class testbase: public CObject { void IncObjectSize(); void DecObjectSize(); protected: T m_var; public: explicit testbase(const T& value): m_var(value) {}; virtual ~testbase() {}; T& operator=(const T& obj); }; class test: public testbase<int> { public: test(): testbase(0) {}; ~test() {}; int get() const { return this->m_var; }; }; // test.cpp DWORD CObject::m_dwObjectSize = 0; template<typename T> void testbase<T>::IncObjectSize() { m_dwObjectSize += sizeof(T); } template<typename T> void testbase<T>::DecObjectSize() { m_dwObjectSize -= sizeof(T); } template<typename T> T& testbase<T>::operator=(const T& value) { }hier hab ich link fehler
Error 1 error LNK2001: unresolved external symbol "private: virtual void __thiscall testbase<int>::DecObjectSize(void)" (?DecObjectSize@?testbase@H@@EAEXXZ) main.obj testprj Error 2 error LNK2001: unresolved external symbol "private: virtual void __thiscall testbase
::IncObjectSize(void)" (?IncObjectSize@?testbase@H@@EAEXXZ) main.obj testprj
-
template Implementierungen gehören nicht in ne separate cpp-Datei!!!!
Das gehört in den Header! Außer es sind Spezialisierungen.
-
no_cpp schrieb:
template Implementierungen gehören nicht in ne separate cpp-Datei!!!!
Das gehört in den Header! Außer es sind Spezialisierungen.wenn du recht hast, dann muesste der operatorueberladung auch linkfehler verursachen, dies is aber nicht der fall
-
JnZn558 schrieb:
wenn du recht hast, dann muesste der operatorueberladung auch linkfehler verursachen, dies is aber nicht der fall
Er hat aber recht. Pack die Implementierung in die Header-Datei, dann wird es gehen.
-
JnZn558 schrieb:
no_cpp schrieb:
template Implementierungen gehören nicht in ne separate cpp-Datei!!!!
Das gehört in den Header! Außer es sind Spezialisierungen.wenn du recht hast, dann muesste der operatorueberladung auch linkfehler verursachen, dies is aber nicht der fall
Dann verwende deinen operator= mal. wirst sehen, dann bekommst du deinen Linker-Error!
-
hab IncObjectSize() und DecObjectSize() in die Headerdatei gepackt, und operator=() bleib in cpp datei, und es kompliert problemlos, nun es dies find ich scheiss, dass implementierung in der headerdatei is, wieso geht bei operator, aber bei den andere beide nicht.
-
Der Operator geht auch nichzt, du benutzt ihn bloß nicht, weswegen der Linker auch nicht nach dem Symbol sucht.
-
JnZn558 schrieb:
hab IncObjectSize() und DecObjectSize() in die Headerdatei gepackt, und operator=() bleib in cpp datei, und es kompliert problemlos, nun es dies find ich scheiss, dass implementierung in der headerdatei is, wieso geht bei operator, aber bei den andere beide nicht.
lies doch wenigsten einmal nach, was du geschrieben hast, bevor du auf absenden klickst... wenn nicht jeder schon davor gewusst hätte, was du willst, hätte das hier wahrscheinlich keiner verstanden...