Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy constructor of template class

Tags:

I read that template copy-con is never default copy onstructor, and template assignment-op is never a copy assignment operator.

I couldn't understand why this restriction is needed and straight away went online to ideone and return a test program but here copy constructor never gets called on further googling I came across templatized constructor and tried that but still it never calls copy constructor.

#include <iostream> using namespace std;  template <typename T> class tt {     public :     tt()     {         std::cout << std::endl << "   CONSTRUCTOR" << std::endl;     }     template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << "   OPERATOR" << std::endl;}     template <typename U> tt(const tt<U>& that)     {         std::cout << std::endl << "    COPY CONSTRUCTOR" << std::endl;     } };   tt<int> test(void) {     std::cout << std::endl << "      INSIDE " << std::endl; tt<int> a; return a; }  int main() {     // your code goes here     tt<int> a ; a = test();      return 0; } 

Can someone explain me the whole reason behind putting this restriction and also how to write a copy constructor of template class.

Thanks

like image 508
anonymous Avatar asked Oct 03 '13 19:10

anonymous


People also ask

What is the copy constructor of a class?

Copy constructors are the member functions of a class that initialize the data members of the class using another object of the same class. It copies the values of the data variables of one object of a class to the data members of another object of the same class.

How do you create a copy constructor for a class?

Copy Constructor in C++ClassName (const ClassName &old_obj); Copy constructor is used to initialize the members of a newly created object by copying the members of an already existing object. Copy constructor takes a reference to an object of the same class as an argument.

Can constructor be template C++?

As long as you are satisfied with automatic type inference, you can use a template constructor (of a non-template class). @updogliu: Absolutely. But, the question is asking about "a template constructor with no arguments" If there are no function arguments, no template arguments may be deduced.

Is copy constructor default in C++?

In C++, compiler created default constructor has an empty body, i.e., it doesn't assign default values to data members. However, in Java default constructors assign default values. The compiler also creates a copy constructor if we don't write our own copy constructor.


2 Answers

I can't comment on why this is how it is, but here's how you write a copy constructor and assignment operator for a class template:

    template <class T>     class A     {       public:         A(const A &){}         A & operator=(const A& a){return *this;}     }; 

and that's it.
The trick here is that even though A is a template, when you refer to it inside the class as A (such as in the function signatures) it is treated as the full type A<T>.

like image 71
SirGuy Avatar answered Oct 05 '22 19:10

SirGuy


There are strict rules what constitutes a copy constructor (cf. C++11, 12.8):

  • It is not a template.

  • For a class T, its first argument must have type T & or T const & or T volatile & or T const volatile &.

  • If it has more than one argument, the further arguments must have default values.

If you do not declare a copy constructor, a copy constructor of the form T::T(T const &) is implicitly declared for you. (It may or may not actually be defined, and if it is defined it may be defined as deleted.)

(The usual overload resolution rules imply that you can have at most four copy constructors, one for each CV-qualification.)

There are analogous rules for move constructors, with && in place of &.

like image 25
Kerrek SB Avatar answered Oct 05 '22 18:10

Kerrek SB