Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ template copy constructor not available or explicit

Tags:

People also ask

Which options are valid for calling a copy constructor?

In C++, a Copy Constructor may be called for the following cases: 1) When an object of the class is returned by value. 2) When an object of the class is passed (to a function) by value as an argument. 3) When an object is constructed based on another object of the same class.

Is there a default copy constructor in C++?

Default Copy Constructors: When a copy constructor is not defined, the C++ compiler automatically supplies with its self-generated constructor that copies the values of the object to the new object.

Does copy constructor call default constructor?

The answer is No. The creation of the object memory is done via the new instruction. Copy constructor is then in charge of the actual copying (relevant only when it's not a shallow copy, obviously). You can, if you want, explicitly call a different constructor prior to the copy constructor execution.

Why copy constructor argument should be const in C ++?

According to C++ copy constructor, we pass an object by reference to the copy function Object() { [native code] }, and we usually pass it as a const reference. One justification for passing a const reference is that it can use const wherever possible in C++ to avoid unintentionally changing objects.


I wrote a code with template copy constructor to get a better understanding of the concept as I am new to it but the following code fails to compile

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
class Grid
{
public:
    explicit Grid(size_t inWidth = kDefaultWidth, size_t inHeight = kDefaultHeight);
    virtual ~Grid();

    template <typename E>
    Grid(const Grid<T>& src);

    static const size_t kDefaultWidth = 10;
    static const size_t kDefaultHeight = 10;
    std::vector<std::vector<T>> mCells;
    size_t mWidth, mHeight;
};

template <typename T>
template <typename E>
Grid<T>::Grid(const Grid<T>& src)
{
    cout << "Copy constructor working " << endl;

}

int main()
{
    Grid<double> myDoubleGrid;
    Grid<double> newDoubleGrid(myDoubleGrid);
    return 0;
}

On compiling the above code in visual studio following error appears:-

ERROR:-

Severity Code Description Project File Line Suppression State Error C2558 class 'Grid': no copy constructor available or copy constructor is declared 'explicit'

I have tried to replace the argument's template with E and It shows more errors (strange ones)

template <typename T>
template <typename E>
Grid<T>::Grid(const Grid<E>& src)
{
    cout << "Copy constructor working " << endl;

}

Errors:

Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "public: __thiscall Grid::Grid(unsigned int,unsigned int)" (??0?$Grid@N@@QAE@II@Z) referenced in function _main

Error LNK1120 2 unresolved externals

Error LNK2019 unresolved external symbol "public: virtual __thiscall Grid::~Grid(void)" (??1?$Grid@N@@UAE@XZ) referenced in function "public: virtual void * __thiscall Grid::`scalar deleting destructor'(unsigned int)" (??_G?$Grid@N@@UAEPAXI@Z)