Re: templated class : constructor specialization
JSeb ha scritto:
Requiring the programmer to provide a full definition gives you full
control on the specialization, in the sense that not only you can add or
replace features, you can also remove them.
But what if I want to reuse them?
Suppose CTemplateClass<T> contains a gazillion methods; will I have to
redeclare/redefine them all in CTemplateClass<T*> ?
Yes.
From my current understanding, the answer would be yes: even if
CTemplateClass<T>::FooBar() and CTemplateClass<T*>::FooBar() are
identical, FooBar has to be defined in both class templates...
Correct.
Wouldn't there be another way, that wouldn't require me to maintain a
class template and its specialization "in sync"? Should I look towards
class template INHERITANCE?
If you want to factor code common to all specializations, you can use a
base class, for example:
template <class T>
class CTemplateClassCommon
{ /* common part */ };
template <class T>
class CTemplateClass : public CTemplateClassCommon<T>
{ /* main template */ };
template <class T>
class CTemplateClass<T*> : public CTemplateClassCommon<T*>
{ /* specialization */ };
PS: exercise for the reader: give the OP's definitions, what is the
destructor of CTemplateClass<T*>?
CTemplateClass<T>::~CTemplateClass()
{
delete this->mpData;
}
CTemplateClass<T*>::~CTemplateClass()
{
// Show some manners!
//delete this->mpData;
}
Gotcha! The right answer is that, given the OP's definition, the
destructor of CTemplateClass<T*> is trivial. That's because you didn't
declare it (the declaration in CTemplateClass<T> doesn't count!) and the
class has neither bases nor data members.
It's illegal to explicitly provide an implementation of a trivial
destructor, as the compiler implicitly generates it for you. Notice, in
particular, that while the destructor of CTemplateClass<T> is virtual,
the destructor of CTemplateClass<T*> isn't. Because of that,
CTemplateClass<T> is polymorphic and CTemplateClass<T*> isn't.
HTH,
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]