We have just started OOP but due to sudden vacation we got an assignment in which many concepts weren't taught like templates, so I am still skeptical about whether I used it correctly or not. And this is my first question here, so sorry if my formatting is not correct.
#include<iostream>
using namespace std;
#include<string>
//global error flag for dequeue
bool ERR_Flag = false;
template<class T>
class queue
{
    protected:
    int front;
    int rear;
    int capacity;
    T *ele;
    public:
    //constructor to allocate memory and initialize data members
    queue();
    bool isempty();
    bool isfull();
    //Check if queue is full before insertion
    //if queue is full return false
    // insert element and return true otherwise
    bool enqueue(T data);
    //funtion to remove an element and return
    T dequeue();
    ~queue();
    void print();
};
template<class T>
class deque:public queue<T>
{
    public:
    bool push_Back(T data);
    bool push_Front(T data);
    T pop_Front();
    T pop_Back();
};
template<>
queue<int> :: queue()
{
    front = -1;
    rear = -1;
    capacity = 5;
    int ele[5];
}
template<>
bool queue<int> :: isempty()
{
    if(front == -1 && rear == -1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
template<>
bool queue<int> :: isfull()
{
    if(rear = capacity - 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
template<>
bool queue<int> :: enqueue(int data)
{
    if(front == -1 && rear == -1)
    {
        front++;
        rear++;
        ele[rear] = data;
        return 1;
    }
    else if(rear == capacity - 1)
    {
        rear++;
        ele[rear] = data;
        return 1;
    }
    else
    {
        return 0;
    }
}
template<>
int queue<int> :: dequeue()
{
    if(front == -1)
    {
        ERR_Flag = 0;
    }
    else
    {
        int a;
        a = ele[front];
        return a;
        front--;
    }
}
template<>
void queue<int> :: print()
{
    cout<<ele[front];
}
template<>
bool deque<string> :: push_Front(string data)
{
    if(front == -1 && rear == -1)
    {
        front = 0;
        rear = 0;
        ele[front] = data;
        return 1;
    }
    else if(rear == capacity - 1)
    {
        return 0;
    }
    else
    {
        for(int i = rear; i >= 0; i--)
        {
            ele[i+1] = ele[i];
        }
        rear++;
        ele[front] = data;
        return 1;
    }
}
template<>
bool deque<string> :: push_Back(string data)
{
    if(front == -1 && rear == -1)
    {
        front = 0;
        rear = 0;
        ele[0] = data;
        return 1;
    }
    else if(rear == capacity - 1)
    {
        return 0;
    }
    else
    {
        rear++;
        ele[rear] = data;
        return 1;
    }
}
template<>
string deque<string> :: pop_Front()
{
    if(front == -1)
    {
        ERR_Flag = 0;
    }
    else
    {
        string s;
        s = ele[front];
        front++;
        return s;
    }
}
template<>
string deque<string> :: pop_Back()
{
    if(front == -1)
    {
        ERR_Flag = 0;
    }
    else
    {
        string s;
        s = ele[rear];
        rear--;
        return s;
    }
}
int main()
{
    int d_Choice;
    int op_Choice;
    deque<string> d;
    queue<int> q;
    cin>>d_Choice;  
    if(d_Choice==1)
    {
        while(1)
        {
            cin>>op_Choice;
            if(op_Choice==1)
            {
                if(q.isempty())
                cout<<"Queue is empty"<<endl;
                else
                cout<<"Queue is not empty"<<endl;
            }
            else if(op_Choice==2)
            {
                if(q.isfull())
                cout<<"Queue is full"<<endl;
                else
                cout<<"Queue is not full"<<endl;
            }
            else if(op_Choice==3)
            {
                int data;
                cin>>data;
                if(!q.enqueue(data))
                cout<<"Queue full insertion not possible";
            }
            else if(op_Choice==4)
            {
                q.dequeue();
                if(ERR_Flag)
                cout<<"Queue is empty";
            }
            else if(op_Choice==5)
            {
                q.print();
            }
            else if(op_Choice==6)
            {
            break;
            }
        }
    }
    else if(d_Choice==2)
    {
        string s_Data;
        while(1)
        {
            cin>>op_Choice;
            if(op_Choice==1)
            {
                if(d.isempty())
                cout<<"Queue is empty"<<endl;
                else
                cout<<"Queue is not empty"<<endl;
            }
            else if(op_Choice==2)
            {
                if(d.isfull())
                cout<<"Queue is full"<<endl;
                else
                cout<<"Queue is not full"<<endl;
            }
            else if(op_Choice==3)
            {
                cin>>s_Data;
                if(!d.push_Back(s_Data))
                cout<<"Queue full insertion not possible";
            }
            else if(op_Choice==4)
            {
                cin>>s_Data;
                if(!d.push_Front(s_Data))
                cout<<"Queue full insertion not possible";              
            }
            else if(op_Choice==5)
            {
                d.pop_Back();
                if(ERR_Flag)
                cout<<"Queue is empty";
            }
            else if(op_Choice==6)
            {
                d.pop_Front();
                if(ERR_Flag)
                cout<<"Queue is empty";
            }
            else if(op_Choice==7)
            {
                d.print();              
            }
            else if(op_Choice==8)
            {
                break;
            }
        }
    }
}
Error:
/tmp/ccw2hdxf.o: In function `main':
main.cpp:(.text+0x6c5): undefined reference to `queue::isempty()'
main.cpp:(.text+0x719): undefined reference to `queue::isfull()'
main.cpp:(.text+0x8df): undefined reference to `queue::print()'
main.cpp:(.text+0x90d): undefined reference to `queue::~queue()'
main.cpp:(.text+0x962): undefined reference to `queue::~queue()'
/tmp/ccw2hdxf.o: In function `deque<std::string>::deque()':
main.cpp:(.text._ZN5dequeISsEC2Ev[_ZN5dequeISsEC5Ev]+0x14): undefined reference to `queue::queue()'
/tmp/ccw2hdxf.o: In function `deque<std::string>::~deque():
main.cpp:(.text._ZN5dequeISsED2Ev[_ZN5dequeISsED5Ev]+0x14): undefined reference to `queue::~queue()'
collect2: error: ld returned 1 exit status
I can only change the declarations of functions since other things have been given in the question.
EDIT: After defining the member functions for T, I am getting the following errors. And I can't change anything except the declaration for the member functions since the definitions for member functions and the main function is already provided. CODE:
#include<iostream>
using namespace std;
#include<string>
//global error flag for dequeue
bool ERR_Flag = false;
template<class T>
class queue
{
    protected:
    int front;
    int rear;
    int capacity;
    T *ele;
    public:
    //constructor to allocate memory and initialize data members
    queue();
    bool isempty();
    bool isfull();
    //Check if queue is full before insertion
    //if queue is full return false
    // insert element and return true otherwise
    bool enqueue(T data);
    //funtion to remove an element and return
    T dequeue();
    ~queue();
    void print();
};
template<class T>
class deque:public queue<T>
{
    public:
    bool push_Back(T data);
    bool push_Front(T data);
    T pop_Front();
    T pop_Back();
};
template<typename T>
queue<T> :: queue()
{
    front = -1;
    rear = -1;
    capacity = 5;
    T ele[5];
}
template<typename T>
bool queue<T> :: isempty()
{
    if(front == -1 && rear == -1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
template<typename T>
bool queue<T> :: isfull()
{
    if(rear == capacity - 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
template<typename T>
bool queue<T> :: enqueue(T data)
{
    if(front == -1 && rear == -1)
    {
        front++;
        rear++;
        ele[rear] = data;
        return 1;
    }
    else if(rear == capacity - 1)
    {
        rear++;
        ele[rear] = data;
        return 1;
    }
    else
    {
        return 0;
    }
}
template<typename T>
T queue<T> :: dequeue()
{
    if(front == -1)
    {
        ERR_Flag = 0;
    }
    else
    {
        T a;
        a = ele[front];
        return a;
        front--;
    }
}
template<typename T>
void queue<T> :: print()
{
    cout<<ele[front];
}
template<typename T>
bool deque<T> :: push_Front(T data)
{
    if(front == -1 && rear == -1)
    {
        front = 0;
        rear = 0;
        ele[front] = data;
        return 1;
    }
    else if(rear == capacity - 1)
    {
        return 0;
    }
    else
    {
        for(int i = rear; i >= 0; i--)
        {
            ele[i+1] = ele[i];
        }
        rear++;
        ele[front] = data;
        return 1;
    }
}
template<typename T>
bool deque<T> :: push_Back(T data)
{
    if(front == -1 && rear == -1)
    {
        front = 0;
        rear = 0;
        ele[0] = data;
        return 1;
    }
    else if(rear == capacity - 1)
    {
        return 0;
    }
    else
    {
        rear++;
        ele[rear] = data;
        return 1;
    }
}
template<typename T>
T deque<T> :: pop_Front()
{
    if(front == -1)
    {
        ERR_Flag = 0;
    }
    else
    {
        T s;
        s = ele[front];
        front++;
        return s;
    }
}
template<typename T>
T deque<T> :: pop_Back()
{
    if(front == -1)
    {
        ERR_Flag = 0;
    }
    else
    {
        T s;
        s = ele[rear];
        rear--;
        return s;
    }
}
int main()
{
    int d_Choice;
    int op_Choice;
    deque<string> d;
    queue<int> q;
    cin>>d_Choice;  
    if(d_Choice==1)
    {
        while(1)
        {
            cin>>op_Choice;
            if(op_Choice==1)
            {
                if(q.isempty())
                cout<<"Queue is empty"<<endl;
                else
                cout<<"Queue is not empty"<<endl;
            }
            else if(op_Choice==2)
            {
                if(q.isfull())
                cout<<"Queue is full"<<endl;
                else
                cout<<"Queue is not full"<<endl;
            }
            else if(op_Choice==3)
            {
                int data;
                cin>>data;
                if(!q.enqueue(data))
                cout<<"Queue full insertion not possible";
            }
            else if(op_Choice==4)
            {
                q.dequeue();
                if(ERR_Flag)
                cout<<"Queue is empty";
            }
            else if(op_Choice==5)
            {
                q.print();
            }
            else if(op_Choice==6)
            {
            break;
            }
        }
    }
    else if(d_Choice==2)
    {
        string s_Data;
        while(1)
        {
            cin>>op_Choice;
            if(op_Choice==1)
            {
                if(d.isempty())
                cout<<"Queue is empty"<<endl;
                else
                cout<<"Queue is not empty"<<endl;
            }
            else if(op_Choice==2)
            {
                if(d.isfull())
                cout<<"Queue is full"<<endl;
                else
                cout<<"Queue is not full"<<endl;
            }
            else if(op_Choice==3)
            {
                cin>>s_Data;
                if(!d.push_Back(s_Data))
                cout<<"Queue full insertion not possible";
            }
            else if(op_Choice==4)
            {
                cin>>s_Data;
                if(!d.push_Front(s_Data))
                cout<<"Queue full insertion not possible";              
            }
            else if(op_Choice==5)
            {
                d.pop_Back();
                if(ERR_Flag)
                cout<<"Queue is empty";
            }
            else if(op_Choice==6)
            {
                d.pop_Front();
                if(ERR_Flag)
                cout<<"Queue is empty";
            }
            else if(op_Choice==7)
            {
                d.print();              
            }
            else if(op_Choice==8)
            {
                break;
            }
        }
    }
}
ERROR:
> main.cpp: In member function ‘bool deque<T>::push_Front(T)’:
> main.cpp:113:8: error: ‘front’ was not declared in this scope
     if(front == -1 && rear == -1)
        ^~~~~
>main.cpp:113:23: error: ‘rear’ was not declared in this scope
     >if(front == -1 && rear == -1)
                       ^~~~
>main.cpp:117:9: error: ‘ele’ was not declared in this scope
         >ele[front] = data;
         ^~~
>main.cpp:120:21: error: ‘capacity’ was not declared in this scope
     >else if(rear == capacity - 1)
                     ^~~~~~~~
>main.cpp:128:13: error: ‘ele’ was not declared in this scope
             >ele[i+1] = ele[i];
             ^~~
>main.cpp:131:9: error: ‘ele’ was not declared in this scope
         >ele[front] = data;
         ^~~
>main.cpp: In member function ‘bool deque<T>::push_Back(T)’:
>main.cpp:138:8: error: ‘front’ was not declared in this scope
     >if(front == -1 && rear == -1)
        ^~~~~
>main.cpp:138:23: error: ‘rear’ was not declared in this scope
     >if(front == -1 && rear == -1)
                       ^~~~
>main.cpp:142:9: error: ‘ele’ was not declared in this scope
         >ele[0] = data;
         ^~~
>main.cpp:145:21: error: ‘capacity’ was not declared in this scope
     >else if(rear == capacity - 1)
                     ^~~~~~~~
>main.cpp:152:9: error: ‘ele’ was not declared in this scope
         >ele[rear] = data;
         ^~~
>main.cpp: In member function ‘T deque<T>::pop_Front()’:
>main.cpp:159:8: error: ‘front’ was not declared in this scope
     >if(front == -1)
        ^~~~~
>main.cpp:166:13: error: ‘ele’ was not declared in this scope
         >s = ele[front];
             ^~~
>main.cpp: In member function ‘T deque<T>::pop_Back()’:
>main.cpp:174:8: error: ‘front’ was not declared in this scope
     >if(front == -1)
        ^~~~~
>main.cpp:181:13: error: ‘ele’ was not declared in this scope
         >s = ele[rear];
             ^~~
>main.cpp:181:17: error: ‘rear’ was not declared in this scope
         >s = ele[rear];
```                 ^~~~
 
    