今天编译数据结构时,遇见一个编译错误
假设你有一个头文件 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