我不明白为什么在主程序中的void函数中,我在客户端列表中出现了一个错误,即" c++缺少变量模板参数列表";每个clientList从链表调用函数时。奇怪的是,除了main类,我在其他类中没有错误。
template< class TYPE >
LinkedList<Client> clientList;
void showClientListState()
{
cout << "Premier client: ";
clientList.front().writeClientInfo();
cout << "Dernier client: ";
clientList.back().writeClientInfo();
cout << "nn";
}
如果你想检查我剩下的代码:
LinkedList
#pragma once
#include "List.h"
template< class TYPE >
class LinkedList : public List<TYPE>
{
public:
LinkedList()
{
this->first = nullptr;
this->last = nullptr;
this->nbElements = 0;
}
~LinkedList()
{
while (!isEmpty())
{
pop();
}
}
void push(const Node<TYPE>& content)
{
Node<TYPE>* ptrClient = new Node<TYPE>(content);
if (isEmpty()) {
this->first = ptrClient;
this->last = ptrClient;
}
else
{
last->setNext(ptrClient);
last = ptrClient;
}
nbElements++;
}
void pop()
{
if (isEmpty()) {
throw EmptyList();
}
Node<TYPE>* tempNodel;
tempNodel = first;
if (first == last)
{
first = last = nullptr;
}
else
{
first = first->getNext();
}
delete tempNodel;
nbElements--;
}
Node<TYPE>& front()
{
if (isEmpty())
{
throw EmptyList();
}
return *first->getContent();
}
Node<TYPE>& back()
{
if (isEmpty())
{
throw EmptyList();
}
return *last->getContent();
}
bool isEmpty() const
{
return (first == nullptr && last == nullptr);
}
int size() const
{
return nbElements;
}
private:
LinkedList(const ClientList&);
Node<TYPE>* first;
Node<TYPE>* last;
int nbElements;
};
列表界面
#pragma once
#pragma once
#include "EmptyList.h"
template< class TYPE >
class List
{
public:
// Ajoute un élément à la fin de la file.
// Postconditions : nbElements devra être incrémenté de 1.
virtual void push(const TYPE& content) = 0;
// Enlève un élément au début de la file.
// Précondition: nbElements > 0. Postcondition: nbElements sera décrémenté de 1.
virtual void pop() = 0;
// Retourne l’élément au début de la file.
// Précondition: nbElements > 0.
virtual TYPE& front() = 0;
// Retourne l’élément à la fin de la file.
// Précondition: nbElements > 0.
virtual TYPE& back() = 0;
// Retourne true si la file est vide ou false sinon.
virtual bool isEmpty() const = 0;
// Retourne le nombre d’éléments dans la file.
virtual int size() const = 0;
};
节点类#pragma once
template< class TYPE >
class Node
{
public:
Node(const TYPE& content)
{
setContent(content);
setNext(nullptr);
}
~Node()
{
delete content;
}
Node* getNext()
{
return this->next;
}
void setNext(Node* next)
{
this->next = next;
}
//Retourne le contenu de cet élément.
TYPE* getContent()
{
return this->content;
}
//Change la contenu de cet élément.
void setContent(const TYPE& content)
{
this->content = new TYPE(content);
}
private:
Node* next = nullptr;
TYPE* content = nullptr;
};
和Main,我不能触摸除了从模板创建链表
#include <iostream>
#include <vld.h>
#include "LinkedList.hpp"
#include "Client.h"
using namespace std;
LinkedList<Client> clientList;
template< class TYPE >
void showClientListState()
{
cout << "Premier client: ";
clientList.front().writeClientInfo();
cout << "Dernier client: ";
clientList.back().writeClientInfo();
cout << "nn";
}
template< class TYPE >
void manageClientAdd(const Client& client)
{
cout << "Ajout d'un clientn";
clientList.push(client);
showClientListState();
}
template< class TYPE >
void manageClientRemove()
{
cout << "Retrait d'un clientn";
if (clientList.isEmpty())
{
cout << "La liste était déja videnn";
return;
}
clientList.pop();
if (clientList.isEmpty())
cout << "La liste est maintenant videnn";
else
showClientListState();
}
template< class TYPE >
void main()
{
setlocale(LC_ALL, "fr-CA");
cout << "nUtilisation de la liste de clients.nn";
Client client1(1, "Télesphore", "LeGamer");
Client client2(2, "Herménégide", "LaVedette");
Client client3(3, "Leopoldine", "LaSportive");
Client client4(4, "Amidala", "LaPrincesse");
manageClientAdd(client1);
manageClientAdd(client2);
manageClientAdd(client3);
manageClientAdd(client4);
for (int i =0; i < 5; i++)
manageClientRemove();
system("Pause");
}
代替
template<class TYPE>
LinkedList<Client> clientList;
你想写
LinkedList<Client> clientList;
即移除clientList
声明前的template<class TYPE>
。你不希望clientList
是一个新的变量模板,你希望它是一个碰巧具有模板实例类型的变量。
除了布莱恩的回答,在你的" Main"代码,删除所有"模板"class TYPE>"s.
:
template< class TYPE >
void showClientListState()
{
...
必须
void showClientListState()
{
...
也一样template< class TYPE >
void manageClientAdd(const Client& client)
{
...
template< class TYPE >
void manageClientRemove()
{
template< class TYPE >
void main()
{
这些函数都不应该或不能依赖于任何模板形参。代码中唯一直接依赖于模板参数的是LinkedList
。但是LinkedList<Client>
也不依赖于模板参数,因为您使用Client
完全指定了它的类型。
因此,对于showClientListState
更改:
template< class TYPE >
LinkedList<Client> clientList;
void showClientListState()
{
到
#include "Client.h"
LinkedList<Client> clientList;
void showClientListState()
{
这些只是明显的错误。要得到完整的答案,你必须写出整个问题。但是不要只是上传更多的代码。生成一个最小可复制示例。一般来说,问问题是很重要的。