Вы используете deque<string>
, который наследуется от queue<string>
в main
. Поэтому, когда вы вызываете, например, d.isempty()
, вы вызываете функцию-член класса queue<string>
.
Но вы определили определение только для queue<int>::is_empty()
, а не для queue<string>::is_empty()
, что и является сообщение об ошибке говорит вам.
Другие сообщения об ошибках имеют аналогичные причины.
Почему вы используете явные специализации в первую очередь? Просто определите функции-члены для всех типов T
, например:
template<typename T>
bool queue<T> :: isempty()
{
if(front == -1 && rear == -1)
{
return 1;
}
else
{
return 0;
}
}
вместо
template<>
bool queue<int> :: isempty()
{
if(front == -1 && rear == -1)
{
return 1;
}
else
{
return 0;
}
}
Как упоминалось в комментариях к вопросу, using namespace std;
также может легко вызвать проблемы здесь. Уже есть шаблоны классов с именами queue
и deque
в пространстве имен std::
, и если они будут включены, станет неоднозначным, относятся ли эти имена к вашим классам или к тем, которые указаны в std::
. Не используйте using namespace std;
и импортируйте только те имена, которые вам нужны, с объявлениями using
, например:
using std::cout;
using std::endl;
using std::string;
using std::cin;
и т. Д.