Template copy constructor question.

Discussion in 'C++' started by ravajappa.gouda@gmail.com, Nov 29, 2008.

  1. Guest

    Hi! Can somebody tell me when does copy constructor 1 or 2 gets called
    in a template class below? And if you can explain the difference
    between the 1 and 2 below would be great?


    template<typename T, size_t size>
    class container {

    public:
    container() //default constructor.
    {
    }

    template<typename cT, size_t cs> // Copy
    constructor 1
    container(const container<cT, cs>& rhs)
    {
    ........
    }

    container(const container& rhs) // Copy
    constructor 2
    {
    ...........
    }


    private: ..... //
    private members defined here.
    };
    , Nov 29, 2008
    #1
    1. Advertising

  2. peter koch Guest

    On 29 Nov., 12:16, ""
    <> wrote:
    > Hi! Can somebody tell me when does copy constructor 1 or 2 gets called
    > in a template class below? And if you can explain the difference
    > between the 1 and 2 below would be great?
    >
    > template<typename T, size_t size>
    > class container {
    >
    > public:
    >   container()   //default constructor.
    >   {
    >   }
    >
    >   template<typename cT, size_t cs>                    // Copy
    > constructor 1
    >   container(const container<cT, cs>& rhs)
    >   {
    >       ........
    >   }
    >
    >   container(const container& rhs)                        // Copy
    > constructor 2
    >   {
    > ..........
    >   }
    >
    > private: .....                                                             //
    > private members defined here.
    >
    >
    >
    > }

    The second constructor is the default copy-constructor and will be
    called whenever a normal copy constructor would normally be called.
    The first one will be called in the other cases - that is if cT is
    different from T or cs is different from size.
    You do need the second constructor if it behaves differently from what
    the compiler would generate: the templated copy constructor will never
    be a substitute for the default constructor and thus you need to
    supply it.

    /Peter
    peter koch, Nov 29, 2008
    #2
    1. Advertising

  3. wrote:
    > Can somebody tell me when does copy constructor 1 or 2 gets called
    > in a template class below?


    This question is already incorrect by itself. There's only one copy
    constructor in your class. It is constructor 2. Template 1 does not
    define any copy constructors. It can be used to generate _conversion_
    constructors, but not copy constructors.

    > And if you can explain the difference
    > between the 1 and 2 below would be great?


    I don't really see what needs to be explained here. These constructors
    take arguments of different types. So the right one will be chosen
    depending on the type of the argument used during construction. That's
    basically it.

    > template<typename T, size_t size>
    > class container {
    >
    > public:
    > container() //default constructor.
    > {
    > }
    >
    > template<typename cT, size_t cs> // Copy
    > constructor 1
    > container(const container<cT, cs>& rhs)
    > {
    > ........
    > }
    >
    > container(const container& rhs) // Copy
    > constructor 2
    > {
    > ..........
    > }
    >
    >
    > private: ..... //
    > private members defined here.
    > };


    --
    Best regards,
    Andrey Tarasevich
    Andrey Tarasevich, Nov 29, 2008
    #3
  4. James Kanze Guest

    On Nov 29, 1:15 pm, peter koch <> wrote:
    > On 29 Nov., 12:16, ""


    > <> wrote:
    > > Hi! Can somebody tell me when does copy constructor 1 or 2
    > > gets called in a template class below? And if you can
    > > explain the difference between the 1 and 2 below would be
    > > great?


    > > template<typename T, size_t size>
    > > class container {


    > > public:
    > >   container()   //default constructor.
    > >   {
    > >   }


    > >   template<typename cT, size_t cs>                    // Copy
    > > constructor 1
    > >   container(const container<cT, cs>& rhs)
    > >   {
    > >       ........
    > >   }


    > >   container(const container& rhs)                        // Copy
    > > constructor 2
    > >   {
    > > ..........
    > >   }


    > > private: .....                                                             //
    > > private members defined here.
    > > }


    > The second constructor is the default copy-constructor and
    > will be called whenever a normal copy constructor would
    > normally be called.


    That's not quite true. The only real effect of the second
    (other than those associated with any constructor) is to
    suppress the automatic generation of the copy constructor by the
    compiler. In any given situation, which constructor is called
    will depend on operator overload resolution, and it is quite
    possible to design a class so that the template constructor is
    called for copying. (Admittedly, this is a rather exotic point,
    and it's not likely to affect most people's code.)

    --
    James Kanze (GABI Software) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
    James Kanze, Nov 30, 2008
    #4
  5. peter koch Guest

    On 30 Nov., 10:50, James Kanze <> wrote:
    > On Nov 29, 1:15 pm, peter koch <> wrote:
    >
    >
    >
    >
    >
    > > On 29 Nov., 12:16, ""
    > > <> wrote:
    > > > Hi! Can somebody tell me when does copy constructor 1 or 2
    > > > gets called in a template class below? And if you can
    > > > explain the difference between the 1 and 2 below would be
    > > > great?
    > > > template<typename T, size_t size>
    > > > class container {
    > > > public:
    > > >   container()   //default constructor.
    > > >   {
    > > >   }
    > > >   template<typename cT, size_t cs>                    // Copy
    > > > constructor 1
    > > >   container(const container<cT, cs>& rhs)
    > > >   {
    > > >       ........
    > > >   }
    > > >   container(const container& rhs)                        // Copy
    > > > constructor 2
    > > >   {
    > > > ..........
    > > >   }
    > > > private: .....                                                             //
    > > > private members defined here.
    > > > }

    > > The second constructor is the default copy-constructor and
    > > will be called whenever a normal copy constructor would
    > > normally be called.

    >
    > That's not quite true.  The only real effect of the second
    > (other than those associated with any constructor) is to
    > suppress the automatic generation of the copy constructor by the
    > compiler.  In any given situation, which constructor is called
    > will depend on operator overload resolution, and it is quite
    > possible to design a class so that the template constructor is
    > called for copying.  (Admittedly, this is a rather exotic point,
    > and it's not likely to affect most people's code.)
    >


    While I was aware of your first point, your second point is new to me.
    Could you give me an example of how to write the copy-constructor in a
    way that it will not be called to construct an object from an object
    of the same type, using my generic templated constructor instead? I
    have wanted to do so a few times but thought it was not possible and
    instead ended up with two identical pieces of code.

    /Peter
    peter koch, Nov 30, 2008
    #5
    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. Aire
    Replies:
    3
    Views:
    463
    Mike Wahler
    Jan 25, 2004
  2. Indrawati Yahya

    Template copy constructor question

    Indrawati Yahya, Nov 12, 2004, in forum: C++
    Replies:
    2
    Views:
    5,839
    Indrawati Yahya
    Nov 16, 2004
  3. ali
    Replies:
    4
    Views:
    572
    David Harmon
    Mar 5, 2007
  4. Generic Usenet Account
    Replies:
    10
    Views:
    2,218
  5. cinsk
    Replies:
    35
    Views:
    2,595
    James Kanze
    Oct 11, 2010
Loading...

Share This Page