[英]How do I implement "template" in classes? Is there something wrong with my code?
題:
我正在嘗試在我的隊列類中實現“模板”。 我收到錯誤。 我不確定這是語法還是我的“模板”實現有問題。 沒有“模板”,我的程序運行完美。
問題:我不確定“模板”實現是否應該是這樣。 感謝評論和反饋。
這是 SNode 類
#include <string>
using namespace std;
template <class T>
class SNode {
private:
int elem;
T* next;
explicit SNode();
//friend class SQueue<T>;
};
template <class T>
SNode<T>::SNode() : elem(" "), next(nullptr) {}
這是我的 SQueue 類
#include <string>
#include "SNode.h"
using namespace std;
template <class T>
class SQueue {
public:
SQueue();
void enqueue(T);
void dequeue();
void print();
private:
T* front;
T* end;
};
template <class T>
SQueue<T>::SQueue() : front(NULL), end(NULL) {}
template <class T>
void SQueue<T>::enqueue(T e) {
T* np = new T();
np->elem = e;
np->next = NULL;
if (front == NULL && end == NULL) {
front = end = np;
return;
}
end->next = np;
end = np;
}
template <class T>
void SQueue<T>::dequeue() {
T* np = front;
if (front == NULL) {
cout << "The queue is empty-1!" << endl;
return;
}
front = front->next;
delete np;
}
template <class T>
void SQueue<T>::print() {
T* np = front;
if (front == NULL) {
cout << "The queue is empty-2!" << endl;
return;
}
for (T* temp = front; temp != NULL; temp = temp->next) {
if (temp != front) {
cout << " <- ";
}
cout << temp->elem;
}
cout << " [Queue: FIFO- First In First Out]" << endl;
}
這是我的主要/測試文件。
#include <iostream>
#include "SQueue.h"
using namespace std;
int main() {
typedef SQueue<int> SQueue;
SQueue SQ;
cout << "Queue 1: ";
SQ.enqueue(1);
SQ.enqueue(2);
SQ.enqueue(3);
SQ.enqueue(3);
SQ.print();
SQ.dequeue();
SQ.dequeue();
SQ.print();
return 0;
}
ERROR MESSAGE
Severity Code Description Project File Line Suppression State
Error C2227 left of '->elem' must point to class/struct/union/generic type DeleteLinkedList SQueue.h 24
首先,您的節點...
//...
template <class T> // I assume T is the as-yet-unknown type stored in the node.
class SNode {
private:
int elem; // Why int ??
T* next; // Why T*
// Should be:
T elem; // The user data
SNode<T>* next; // the next node.
explicit SNode(); // Why explicit? Do you have a _very_ good reason for that?
// Should read:
SNode() : elem(T()), next(nullptr) {}
friend class SQueue<T>;
};
現在,您正在聲明一個具有私有默認構造函數的類......這是一個非常強烈的跡象,表明 SNode 應該在 SQueue 中聲明,如下所示:
template<class T>
class SQueue
{
public:
// Ideally, this inner class should be declared 'private', and SQueue
// should declare some form of iterator to hide these details from
// the caller... It's best to get everything else running first, and
// add this complexity on a solid base.
//
struct SNode // all members are public.
{
SNode() : elem(T()), next(nullptr) {}
T elem;
SNode* next;
};
public:
// define your constructors and access functions..
private:
SNode* front; // the queue stores a single-linked list of nodes.
// Only one pointer is necessary to do that.
// UNLESS you want to create a list that's optimized for
// appending elements at the end. But optimizations should be
// done after the unoptimized code has been tested and proven
// to work flawlessly.
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.