[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

Problem with template

lhommedumatch

10/10/2008 9:33:00 PM

Hi,
I have a derived template class and I want to call a method of the
derived class from the base class.
But the method need a template parameter.
How can I do?

Here is the code that doesn't work.

#include <iostream>
#include <string>

using namespace std;

//==============================================================
class A
{
public:
A()
{
std::cout << "constructeur de A" << std::endl;
}
~A()
{
std::cout << "destructeur de A" << std::endl;
}
};

//==============================================================
template <class T> class B: public A
{
public:
B():A()
{
std::cout << "constructeur de B" << std::endl;
}
~B()
{
std::cout << "destructeur de B" << std::endl;
}
T _value;
void setValue(T p_value)
{
_value = p_value;
}
};


//==============================================================
int main()
{
A *a = new B<int>;
a->setValue(23131);
delete a;
}
//==============================================================

Thanks
2 Answers

Sam

10/10/2008 10:16:00 PM

0

lhommedumatch writes:

> Hi,
> I have a derived template class and I want to call a method of the
> derived class from the base class.
> But the method need a template parameter.
> How can I do?
>
> Here is the code that doesn't work.
>
> #include <iostream>
> #include <string>
>
> using namespace std;
>
> //==============================================================
> class A
> {
> public:
> A()
> {
> std::cout << "constructeur de A" << std::endl;
> }
> ~A()
> {
> std::cout << "destructeur de A" << std::endl;
> }
> };
>
> //==============================================================
> template <class T> class B: public A
> {
> public:
> B():A()
> {
> std::cout << "constructeur de B" << std::endl;
> }
> ~B()
> {
> std::cout << "destructeur de B" << std::endl;
> }
> T _value;
> void setValue(T p_value)
> {
> _value = p_value;
> }
> };
>
>
> //==============================================================
> int main()
> {
> A *a = new B<int>;
> a->setValue(23131);
> delete a;
> }
> //==============================================================
>
> Thanks

There are several ways to do this.

The easiest way, and is probably what your real intention is, is to declare
setValue() as a pure virtual function in class A:

virtual void setValue(int)=0;

You can also declare ~A() as a virtual destructor. This will enable you to
use dynamic_cast<> to obtain the pointer to your subclass, and invoke it's
setValue() method.


Victor Bazarov

10/12/2008 6:59:00 PM

0

lhommedumatch wrote:
> I have a derived template class and I want to call a method of the
> derived class from the base class.
> But the method need a template parameter.
> How can I do?

Make the base class a template as well, and make that function a pure
virtual function which every derived class must override.

>
> Here is the code that doesn't work.
>
> #include <iostream>
> #include <string>
>
> using namespace std;
>
> //==============================================================

Add here:

template<class T>

> class A
> {
> public:
> A()
> {
> std::cout << "constructeur de A" << std::endl;
> }

Add here

virtual

> ~A()
> {
> std::cout << "destructeur de A" << std::endl;
> }

Add here:

virtual void setValue(T) = 0;

> };
>
> //==============================================================
> template <class T> class B: public A

Add here

<T>

> {
> public:
> B():A()
> {
> std::cout << "constructeur de B" << std::endl;
> }
> ~B()
> {
> std::cout << "destructeur de B" << std::endl;
> }
> T _value;
> void setValue(T p_value)
> {
> _value = p_value;
> }
> };
>
>
> //==============================================================
> int main()
> {
> A *a = new B<int>;
> a->setValue(23131);
> delete a;

If the destructor of A isn't virtual, the deletion of 'a' pointer will
have undefined behaviour.

> }
> //==============================================================
>
> Thanks

YW

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask