help on constructor/constructor initialization list with inheritanceusing templates

B

balaji

Hi,

Pls find below the sample code.

File 1

template< class A, template < typename > class B >
class C : public B<A>
{
public:
explicit C(const char *msg);
~C();

private:
//copy constructor and assignment operator
}

template< class A, template < typename > class B >
C<A, B> :: C(const char *msg)
: B(msg)
{
}

template< class A, template < typename > class B >
C<A, B> :: ~C()
{
}

File 2

template < class Z>
class B : public Z
{
public:
explicit B(const char *msg);
~B();

private:
//copy constructor and assignment operator
}

template < class Z>
B<Z> :: B(const char *msg)
: Z(msg)
{
}

template < class Z>
B<Z>::~B()
{
}

File 3

3.h
class A
{
public:
explicit A(const char *msg);
~A();

private:
//copy constructor and assignment operator
}

3.C
#include "3.h"

A::A(const char *msg)
{
}

A::~A()
{
}

main file

#iinclude file 1, file 2 and file 3(.h)

int
main(int argc, char **argv)
{
C<A,B> objc("Success");
return 0;
}

when i compile this code, i get the following error "The base class
"B<A>" cannot be initialized because it does not have a default
constructor.". I do not understand what i have missed to get this
error. Pls help me to resolve this.

Thanks,
Balaji.
 
J

Jens Thoms Toerring

balaji said:
Pls find below the sample code.
template< class A, template < typename > class B >
class C : public B<A>
{
public:
explicit C(const char *msg);
~C();
private:
//copy constructor and assignment operator
}

You're missing a semicolon here (and also is some other
places at the end of declarations of classes).
template< class A, template < typename > class B >
C<A, B> :: C(const char *msg)
: B(msg)

This is the place my compiler doesn't like when other,
minor issues are fixed:

error: no matching function for call to ‘B<A>::B()’
note: candidates are: B<Z>::B(const char*) [with Z = A]
note: B<A>::B(const B<A>&)

Shouldn't that be

template< class A, template < typename > class B >
C< A, B > :: C( const char * msg )
: B< A >( msg )

since B<A> is the base class C is derived from?

Otherwise I guess the compiler will try to invoke the
default constructor of B<A> (since there's no explicit
call of it - you call B(msg), not B<A>(msg)) and since
there is none it gives up.
Regards, Jens
 
B

balaji

balaji said:
Hi,
Pls find below the sample code.
File 1
template< class A, template < typename > class B >
class C : public B<A>
{
  public:
    explicit C(const char *msg);
    ~C();
  private:
    //copy constructor and assignment operator
}

You're missing a semicolon here (and also is some other
places at the end of declarations of classes).
template< class A, template < typename > class B >
C<A, B> :: C(const char *msg)
  : B(msg)

This is the place my compiler doesn't like when other,
minor issues are fixed:

  error: no matching function for call to ‘B<A>::B()’
  note: candidates are: B<Z>::B(const char*) [with Z = A]
  note:                 B<A>::B(const B<A>&)

Shouldn't that be

template< class A, template < typename > class B >
C< A, B > :: C( const char * msg )
  : B< A >( msg )

since B<A> is the base class C is derived from?

Otherwise I guess the compiler will try to invoke the
default constructor of B<A> (since there's no explicit
call of it - you call B(msg), not B<A>(msg)) and since
there is none it gives up.
                             Regards, Jens

Hi Jens,

Thanks for your response and sorry for the late reply as well.

My post wasn't posted atleast for 2 days i believe or atleast i was
unable to see this post.

I too figured out that. What compiler is yours to give the
"candidates". My compiler didn't say that(itx IBM xlC version 7.0).

Thanks,
Balaji.
 
J

Jens Thoms Toerring

balaji said:
balaji said:
template< class A, template < typename > class B >
C<A, B> :: C(const char *msg)
  : B(msg)

This is the place my compiler doesn't like when other,
minor issues are fixed:

  error: no matching function for call to ‘B<A>::B()’
  note: candidates are: B<Z>::B(const char*) [with Z = A]
  note:                 B<A>::B(const B<A>&)

Shouldn't that be

template< class A, template < typename > class B >
C< A, B > :: C( const char * msg )
  : B< A >( msg )

I too figured out that. What compiler is yours to give the
"candidates". My compiler didn't say that(itx IBM xlC version 7.0).

It's gcc, version 4.4.3. Having the candidates the compiler
considered being shown can be helpful but also, at other times,
a bit annoying when the compiler found hundreds and hundreds
of them and insists on listing each and every one of them;-)

Best regards, Jens
 

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

Forum statistics

Threads
473,962
Messages
2,570,134
Members
46,690
Latest member
MacGyver

Latest Threads

Top