【发布时间】:2021-12-13 05:07:33
【问题描述】:
我不明白为什么在 main 的 void 函数中,调用函数时,每个 clientList 上的客户端列表都有一个错误,即“C++ 缺少变量模板参数列表”从链表。奇怪的是,除了 main 之外,我在其他类中没有错误。
template< class TYPE >
LinkedList<Client> clientList;
void showClientListState()
{
cout << "Premier client: ";
clientList.front().writeClientInfo();
cout << "Dernier client: ";
clientList.back().writeClientInfo();
cout << "\n\n";
}
如果你想检查我的其余代码:
链表
#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 << "\n\n";
}
template< class TYPE >
void manageClientAdd(const Client& client)
{
cout << "Ajout d'un client\n";
clientList.push(client);
showClientListState();
}
template< class TYPE >
void manageClientRemove()
{
cout << "Retrait d'un client\n";
if (clientList.isEmpty())
{
cout << "La liste était déja vide\n\n";
return;
}
clientList.pop();
if (clientList.isEmpty())
cout << "La liste est maintenant vide\n\n";
else
showClientListState();
}
template< class TYPE >
void main()
{
setlocale(LC_ALL, "fr-CA");
cout << "\nUtilisation de la liste de clients.\n\n";
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");
}
【问题讨论】:
-
什么是
Client?你省略了它的声明。 -
"on each clientList" -- 我猜你写的不是你的意思。你的意思是“在每一行使用
clientList”,不是吗?然而,由于clientList是一个模板,“每个clientList”更接近于“每个实例化clientList”的意思。您可能不打算将clientList用作模板,这表明语言精度的重要性。你应该写你的意思,而不是使用懒惰的短语,希望读者愿意填写缺失的单词并填写预期的单词。 -
不应触碰客户端
-
我不明白您所说的“不应触碰客户” 是什么意思。即使您的代码使用
Client,您也不应该碰它?
标签: c++ templates linked-list nodes