Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Class Template with Specialization code Giving Error (http://www.velocityreviews.com/forums/t593192-class-template-with-specialization-code-giving-error.html)

Pallav singh 02-21-2008 10:55 AM

Class Template with Specialization code Giving Error
 
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;

}


Reetesh Mukul 02-21-2008 11:26 AM

Re: Class Template with Specialization code Giving Error
 
On Feb 21, 3:55 pm, Pallav singh <singh.pal...@gmail.com> wrote:
> 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

Pallav singh 02-21-2008 11:36 AM

Re: Class Template with Specialization code Giving Error
 
On Feb 21, 4:26 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:
> On Feb 21, 3:55 pm, Pallav singh <singh.pal...@gmail.com> wrote:> 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


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

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

Pallav singh 02-21-2008 11:39 AM

Re: Class Template with Specialization code Giving Error
 
On Feb 21, 4:36 pm, Pallav singh <singh.pal...@gmail.com> wrote:
> On Feb 21, 4:26 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:
>
>
>
> > On Feb 21, 3:55 pm, Pallav singh <singh.pal...@gmail.com> wrote:> 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

>
> ---------------------------------------------------------------------------------
>
> 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 ........

Reetesh Mukul 02-21-2008 11:41 AM

Re: Class Template with Specialization code Giving Error
 
On Feb 21, 4:36 pm, Pallav singh <singh.pal...@gmail.com> wrote:
> On Feb 21, 4:26 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:
>
>
>
> > On Feb 21, 3:55 pm, Pallav singh <singh.pal...@gmail.com> wrote:> 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

>
> ---------------------------------------------------------------------------------
>
> 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<char>::func() ...
basefield = 1;
>
> 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

Pallav singh 02-21-2008 11:47 AM

Re: Class Template with Specialization code Giving Error
 
On Feb 21, 4:41 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:
> On Feb 21, 4:36 pm, Pallav singh <singh.pal...@gmail.com> wrote:
>
> > On Feb 21, 4:26 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:

>
> > > On Feb 21, 3:55 pm, Pallav singh <singh.pal...@gmail.com> wrote:> 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

>
> > ---------------------------------------------------------------------------------

>
> > 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<char>::func() ...
> basefield = 1;
>
>
>
> > 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


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

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

Reetesh Mukul 02-21-2008 11:50 AM

Re: Class Template with Specialization code Giving Error
 
On Feb 21, 4:47 pm, Pallav singh <singh.pal...@gmail.com> wrote:
> On Feb 21, 4:41 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:
>
>
>
> > On Feb 21, 4:36 pm, Pallav singh <singh.pal...@gmail.com> wrote:

>
> > > On Feb 21, 4:26 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:

>
> > > > On Feb 21, 3:55 pm, Pallav singh <singh.pal...@gmail.com> wrote:> 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

>
> > > ---------------------------------------------------------------------------------

>
> > > 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<char>::func() ...
> > basefield = 1;

>
> > > 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

>
> --------------------------------------------------------------------------
>
> 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

Pallav singh 02-21-2008 12:01 PM

Re: Class Template with Specialization code Giving Error
 
On Feb 21, 4:50 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:
> On Feb 21, 4:47 pm, Pallav singh <singh.pal...@gmail.com> wrote:
>
>
>
> > On Feb 21, 4:41 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:

>
> > > On Feb 21, 4:36 pm, Pallav singh <singh.pal...@gmail.com> wrote:

>
> > > > On Feb 21, 4:26 pm, Reetesh Mukul <reetesh.mu...@gmail.com> wrote:

>
> > > > > On Feb 21, 3:55 pm, Pallav singh <singh.pal...@gmail.com> wrote:> 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

>
> > > > ---------------------------------------------------------------------------------

>
> > > > 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<char>::func() ...
> > > basefield = 1;

>
> > > > 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

>
> > --------------------------------------------------------------------------

>
> > 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


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

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;

}



All times are GMT. The time now is 02:21 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.