help on constructor/constructor initialization list with inheritanceusing templates

Discussion in 'C++' started by balaji, Aug 8, 2011.

  1. balaji

    balaji Guest

    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.
    balaji, Aug 8, 2011
    #1
    1. Advertising

  2. Re: help on constructor/constructor initialization list with inheritance using templates

    balaji <> wrote:
    > 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
    --
    \ Jens Thoms Toerring ___
    \__________________________ http://toerring.de
    Jens Thoms Toerring, Aug 8, 2011
    #2
    1. Advertising

  3. balaji

    balaji Guest

    Re: help on constructor/constructor initialization list withinheritance using templates

    On Aug 8, 2:46 pm, (Jens Thoms Toerring) wrote:
    > balaji <> wrote:
    > > 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
    > --
    >   \   Jens Thoms Toerring  ___      
    >    \__________________________      http://toerring.de


    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.
    balaji, Aug 10, 2011
    #3
  4. Re: help on constructor/constructor initialization list with inheritance using templates

    balaji <> wrote:
    > On Aug 8, 2:46 pm, (Jens Thoms Toerring) wrote:
    > > balaji <> wrote:
    > > > 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
    --
    \ Jens Thoms Toerring ___
    \__________________________ http://toerring.de
    Jens Thoms Toerring, Aug 10, 2011
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. JKop
    Replies:
    3
    Views:
    452
  2. Replies:
    6
    Views:
    451
    Ron Natalie
    Dec 11, 2005
  3. recover
    Replies:
    2
    Views:
    788
    recover
    Jul 25, 2006
  4. toton
    Replies:
    5
    Views:
    920
    Victor Bazarov
    Sep 28, 2006
  5. aaragon
    Replies:
    2
    Views:
    606
    James Kanze
    Nov 2, 2008
Loading...

Share This Page