Class Template with Specialization code Giving Error

P

Pallav singh

Hi

I am getting error in compiling this code .......Unable to find error
Kindly suggest me something.

Thanks
Pallav

===================================================================

#include<iostream.h>

template<typename T>
class B
{
public :

T DependentName;
int basefield;
typedef int X;
};


template<>
class B<char>
{

public :
enum E{basefield = 1};
int func()
{ return basefield;}
};


template<typename T>
class D:B<T>
{
public :
int func()
{ basefield = 12;
return basefield; }
};


void call(D<int> & obj_int){
cout<<"called function :: call(B<int> & obj_int) ::
"<<obj_int.func()<<endl;}

void call(D<char> & obj_char){
cout<<"called function :: call(B<char> & obj_char)::
"<<obj_char.func()<<endl;}


int main()
{

D<char> obj_char;
D<int> obj_int;

call(obj_char);
call(obj_int);

return 0;

}
 
R

Reetesh Mukul

Hi

I am getting error in compiling this code .......Unable to find error
Kindly suggest me something.

Thanks
Pallav

===================================================================

#include<iostream.h>
You should use <iostream> in place of iostream.h. For cout, you can
use
using std::cout;
template<typename T>
class B
{
public :

T DependentName;
int basefield;
typedef int X;

};

template<>
class B<char>
{

public :
enum E{basefield = 1};
int func()
{ return basefield;}

};

template<typename T>
class D:B<T>
{
public :
int func()
{ basefield = 12;
Two errors in this step (when instantiation of D<char> is done):-
1)C++ does not permit implicit conversion from int type to enum type.
That is you cannot write
enum R{A,B};
R x = 1;

2)basefield is an l-value, that is it is an integral constant, a
lvalue. So you cannot assign
any thing to it.
return basefield; }

};

void call(D<int> & obj_int){
cout<<"called function :: call(B<int> & obj_int) ::
"<<obj_int.func()<<endl;}

void call(D<char> & obj_char){
cout<<"called function :: call(B<char> & obj_char)::
"<<obj_char.func()<<endl;}

int main()
{

D<char> obj_char;
D<int> obj_int;

call(obj_char);
call(obj_int);

return 0;

}

Regards,
Reetesh Mukul
 
P

Pallav singh

You should use <iostream> in place of iostream.h. For cout, you can
use
using std::cout;






Two errors in this step (when instantiation of D<char> is done):-
1)C++ does not permit implicit conversion from int type to enum type.
That is you cannot write
enum R{A,B};
R x = 1;

2)basefield is an l-value, that is it is an integral constant, a
lvalue. So you cannot assign
any thing to it.








Regards,
Reetesh Mukul

---------------------------------------------------------------------------------

Hi

as my knowledge with char ...it should look to Base class Specialized
function
where i am Not doing any assignment but access

while it should call generalized Base class for Other cases where i
did assigment

Thanks
Pallav
 
P

Pallav singh

---------------------------------------------------------------------------------

Hi

as my knowledge with char ...it should look to Base class Specialized
function
where i am Not doing any assignment but access

while it should call generalized Base class for Other cases where i
did assigment

Thanks
Pallav

I am also catching object by reference of derived class ........
 
R

Reetesh Mukul

---------------------------------------------------------------------------------

Hi

as my knowledge with char ...it should look to Base class Specialized
function
where i am Not doing any assignment but access
The what about the assignment in D said:
while it should call generalized Base class for Other cases where i
did assigment

Thanks
Pallav

I am not able to get your point, can you explain.

Regards,
Reetesh Mukul
 
P

Pallav singh

The what about the assignment in D<char>::func() ...
basefield = 1;





I am not able to get your point, can you explain.

Regards,
Reetesh Mukul

--------------------------------------------------------------------------

thats beauty of Specialization when i call B<char> it will call
specialized base class for char
Variable / functionality of specialized class has No relation with
Generalized Base Class

when i call B<int> , B<bool> ---------It call generalized Base Class
while when i call B<char> ----------- It should call my Specialized
Base Class

U can see Above in the Code ........ I Have written two class B

Thanks
pallav
 
R

Reetesh Mukul

--------------------------------------------------------------------------

thats beauty of Specialization when i call B<char> it will call
specialized base class for char
Variable / functionality of specialized class has No relation with
Generalized Base Class

when i call B<int> , B<bool> ---------It call generalized Base Class
while when i call B<char> ----------- It should call my Specialized
Base Class

U can see Above in the Code ........ I Have written two class B

Thanks
pallav

Have you read my replies ? I think you are not seeing the D<char>
thing that I have written above.

Ofcourse that is why it is called specialization.

Regards,
Reetesh mukul
 
P

Pallav singh

Have you read my replies ? I think you are not seeing the D<char>
thing that I have written above.

Ofcourse that is why it is called specialization.

Regards,
Reetesh mukul

-----------------------------------------------------------------------

Thanks

I got while D<char> .........the Func() get Over-Ridding and thats
Creating Problem

Any Solution how to handle it in derived

#include<iostream.h>


template<typename T>
class B
{
public :

T DependentName;
int basefield;
typedef int X;
};


template<>
class B<char>
{

public :
enum E{basefield = 1};
int func()
{ return basefield;}
};

template<typename T>
class D1:B<char>
{
public :
int func()
{B<char>::func();}
};


template<typename T>
class D:B<T>
{
public :
int func()
{ basefield = 12;
return basefield; }
};


void call(D<int> & obj_int){
cout<<"called function :: call(B<int> & obj_int) ::
"<<obj_int.func()<<endl;}

void call(D1<char> & obj_char){
cout<<"called function :: call(B<char> & obj_char)::
"<<obj_char.func()<<endl;}


int main()
{

D1<char> obj_char;
D<int> obj_int;

call(obj_char);
call(obj_int);

return 0;

}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top