今天編譯數據結構時,遇見一個編譯錯誤
假設你有一個頭文件 SeqList.h 和一個源文件 SeqList.cpp。
SeqList.h
#ifndef SEQLIST_H
#define SEQLIST_H#include <stdexcept>
#include <iostream>template<typename T>
class SeqList {
private:static const int MAX_SIZE = 100;T data[MAX_SIZE];int length;
public:SeqList();void insert(int index, T value);// 其他成員函數聲明
};#endif
SeqList.cpp
#include "SeqList.h"template<typename T>
SeqList<T>::SeqList() : length(0) {}template<typename T>
void SeqList<T>::insert(int index, T value) {if (length >= MAX_SIZE) {throw std::overflow_error("List is full");}if (index < 0 || index > length) {throw std::out_of_range("Index out of range");}for (int i = length; i > index; i--) {data[i] = data[i - 1];}data[index] = value;length++;
}// 其他成員函數實現
main.cpp
#include "SeqList.h"
#include <iostream>int main() {SeqList<int> list;list.insert(0, 10);return 0;
}
編譯時報如下錯誤
解決辦法
模板函數的實現必須在頭文件中,因為編譯器在實例化模板時需要看到完整的實現。所以,你可以直接把 insert 函數的實現放在頭文件里。
SeqList.h
#ifndef SEQLIST_H
#define SEQLIST_H#include <stdexcept>
#include <iostream>template<typename T>
class SeqList {
private:static const int MAX_SIZE = 100;T data[MAX_SIZE];int length;
public:SeqList() : length(0) {}void insert(int index, T value) {if (length >= MAX_SIZE) {throw std::overflow_error("List is full");}if (index < 0 || index > length) {throw std::out_of_range("Index out of range");}for (int i = length; i > index; i--) {data[i] = data[i - 1];}data[index] = value;length++;}// 其他成員函數聲明和實現
};#endif