int main関数の部のコメント部のなのですが[暗黙的に宣言、削除された関数です]と
エラーが出てしまい修正に困っています、ヘッダー部にoperator関数を用意しているので。何が間違えなのか検討もつきません、教えてもらえますでしょうか?初学者なので解説もお願いしたいです。参考書:新版明解c++中級編 visual studio 2017

//////////////////////boolArray.h////boolへの明示的特殊化をしたクラス/////

#ifndef ___Class_Template_Array_Bool
#define ___Class_Template_Array_Bool
#include <iostream>
#include <limits>
#include "Array.h"

//===== 配列クラステンプレートArray(bool型への特殊化)=====//
template<> class Array<bool> {
    typedef unsigned char BYTE;
    static const int CHAR_BITS = std::numeric_limits<unsigned char>::digits;

    int nelem;      // bool型配列の要素数
    int velem;      // bool型配列を格納するためのBYTE型配列の要素数
    BYTE *vec;      // BYTE型先頭要素へのポインタ

    // bool型sz個の要素の格納に必要なBYTE型配列の要素数
    static int size_of(int sz) { return (sz + CHAR_BITS - 1) / CHAR_BITS; }

public:

        //=== ビットベクトル(バイト)中の1ビットへの参照を表すためのクラス ===//
        class BitOfByteRef {
            BYTE &vec;      // 参照先BYTE
            int idx;// 参照先BYTE中のビット番号

        public:

            BitOfByteRef(BYTE& r, int i) : vec(r), idx(i) { }       // コンストラクタ

            operator bool() const { return (vec >> idx) & 1U; }     // 真偽を取得

            BitOfByteRef& operator = (bool b) {// 真偽を設定
                std::cout << "BitOfByteRef operator = \n";

                if (b)
                    vec |= 1U << idx;
                else
                    vec &= ~(1U << idx);

                return *this;
            }

        };

        //----- 添字範囲エラー class -----//
        class IdxRngErr {
            const Array<bool>* ident;
            int index;
        public:
            IdxRngErr(const Array<bool>* p, int i) : ident(p), index(i) { }

            int Index() const { return index; }
        };

    //--- 明示的コンストラクタ ---//
    explicit Array(int sz, bool v = bool()) : nelem(sz), velem(size_of(sz)) {
        vec = new BYTE[velem];

        for (int i = 0; i < velem; i++) {   // 全要素を初期化
            vec[i] = v;
            std::cout << vec[i]<<'\n';//デバック
        }
    }

    //--- コピーコンストラクタ ---//
    Array(const Array& x) {
        if (&x == this) {                       // 初期化子が自分自身であれば…
            nelem = 0;
            vec = NULL;
        }
        else {
            nelem = x.nelem;                    // 要素数をxと同じにする
            velem = x.velem;                    // 要素数をxと同じにする
            vec = new BYTE[velem];              // 配列本体を確保

            for (int i = 0; i < velem; i++)     // 全要素をコピー
                vec[i] = x.vec[i];
        }
    }

    //--- デストラクタ ---//
    ~Array() { delete[] vec; }

    //--- 要素数を返す ---//
    int size() const { return nelem; }

    //--- 代入演算子= ---//
    Array& operator = (const Array<bool>& x) {
        //std::cout << "=\n";
        if (&x != this) {                   // 代入元が自分自身でなければ…
            if (velem != x.velem) {         // 代入前後の要素数が異なれば…
                delete[] vec;               // もともと確保していた領域を解放
                velem = x.velem;            // 新しい要素数
                vec = new BYTE[velem];      // 新たに領域を確保
            }

            nelem = x.nelem;                // 新しい要素数

            for (int i = 0; i < velem; i++) // 全要素をコピー
                vec[i] = x.vec[i];
        }
        return *this;
    }

    //--- 添字演算子[] ---//
    BitOfByteRef operator[](int i) {
        if (i < 0 || i >= nelem)
            throw IdxRngErr(this, i);               // 添字範囲エラー送出

        return BitOfByteRef(vec[i / CHAR_BITS], (i & (CHAR_BITS - 1)));
    }

    //--- 添字演算子[] ---//
    bool operator[](int i) const {
        if (i < 0 || i >= nelem)
            throw IdxRngErr(this, i);               // 添字範囲エラー送出

        return (vec[i / CHAR_BITS] >> (i & (CHAR_BITS - 1)) & 1U) == 1;
    }

};

//--- Array<bool>型配列aの全要素を0または1で連続表示 ---//
void print_Array_bool(const Array<bool>& a)
{
    for (int i = 0; i < a.size(); i++)
        std::cout << (a[i] ? '1' : '0');

}

#endif

/////////////////////int main関数部//////////////////////////////
#include <iostream>
#include "conio.h"
#include "Array.h"
#include "BoolArray.h"
using namespace std;

int main() {

    Array<bool> x(10);      // 全要素をfalseで初期化
    Array<bool> y(x);       // yはxのコピー(要素数が10で全要素がfalse)
    Array<bool> z(5);       // zの要素数は5だが
    z = y;                  // yが代入されるので要素数は10となる

//  z[1] = y[3];///ここです。
    y[2] = true;
    z[3] = true;

    Array<bool> a(10);

    cout << boolalpha;

    try {

        for (int i = 0; i < x.size(); i++)
        {
            cout << "x[" << i << "] = " << x[i] << '\n';
        }

        std::cout << "\n\n";

        for (int i = 0; i < y.size(); i++)
        {
            cout << "y[" << i << "] = " << y[i] << '\n';
        }

        std::cout << "\n\n";

        for (int i = 0; i < z.size(); i++)
        {
            cout << "z[" << i << "] = " << z[i] << '\n';
        }

    }
    catch (Array<bool>::IdxRngErr &x) {
        cout << "添え字範囲エラー:";

        cout << x.Index();

        _getch();
        return 0;
    }

    cout << "x = ";  print_Array_bool(x);  cout << '\n';
    cout << "y = ";  print_Array_bool(y);  cout << '\n';
    cout << "z = ";  print_Array_bool(z);  cout << '\n';

    _getch();
    return 0;
}