在 C++ 開發中,模板類的聲明與定義不匹配常導致編譯錯誤。本文針對一個典型的鏈表模板類錯誤進行分析,並提供完整的修正方案。
#include <iostream>
using namespace std;
template <class T>
class List {
public:
List(T *elem); // 聲明為指針參數
void Traverse();
private:
typedef struct LNode {
T *m_elem;
struct LNode *next;
} Node, *LinkNode;
LinkNode head;
};
template <class T>
List<T>::List(T &elem) { // 定義為引用參數,與聲明不一致
head = new Node;
*(head->m_elem) = elem; // m_elem 未初始化,解引用導致未定義行為
head->next = NULL;
}
int main(void) {
double a = 2.0;
List<double> head(a); // 傳遞 double 值,但構造函數期望指針
getchar();
return 0;
}
#include <iostream>
using namespace std;
template <class T>
class List {
public:
List(T &elem); // 統一使用引用參數
~List(); // 添加析構函數
void Traverse();
private:
typedef struct LNode {
T *m_elem;
struct LNode *next;
} Node, *LinkNode;
LinkNode head;
};
template <class T>
List<T>::List(T &elem) {
head = new Node;
head->m_elem = &elem; // 正確:存儲引用的地址
head->next = NULL;
}
template <class T>
List<T>::~List() {
Node* p = head, *q;
while (p) {
q = p->next;
delete p;
p = q;
}
head = NULL;
}
int main() {
double a = 2.0;
List<double> head(a); // 正確傳遞引用
getchar();
return 0;
}
現代 C++ 開發中,優先考慮使用標準庫容器(如 `std::list`、`std::vector`)而非手寫數據結構。若必須自定義,請遵循 RAII 原則,使用智能指針(`std::unique_ptr`)管理節點內存,並實現拷貝/移動語義以確保安全性。