模板类多文件项目 - 如何

Template Classes Multiple-File Project - How to?

本文关键字:项目 如何 文件      更新时间:2023-10-16

可能的重复:
为什么仅在标题文件中实现模板?
为什么将模板类的实现和声明在同一标头文件中?

我正在研究一个需要"堆栈"来保存数据的项目。但是我不想为每种文件类型编码不同的版本(而且我不想使用向量)。

所以我正在尝试使用模板类,这是我的代码:

structstack.h

#ifndef STRUCTSTACK_H_
#define STRUCTSTACK_H_
template <class AnyType> class StructStack {
    StructStack();
    ~StructStack();
    struct Element {
        Element *pointer;
        AnyType value;
    };
    Element *pointerToLastElement;
    int stackSize;
    int pop();
    void push(int value);
    int size();
};
#endif

structstack.cpp

#include "stdafx.h"
#include "StructStack.h"
#include <iostream>
using namespace std;

template <class AnyType> void StructStack<AnyType>::StructStack() {
    //code
}
template <class AnyType> void StructStack<AnyType>::~StructStack() {
    //code
}
template <class AnyType> AnyType StructStack<AnyType>::pop() {
    //code
}
template <class AnyType> void StructStack<AnyType>::push(AnyType value){
    //code
}
template <class AnyType> AnyType StructStack<AnyType>::size() {
    //code
}

如果我尝试编译这两个文件,我会遇到很多编译错误。我在线阅读,很难在一个多文件项目中创建模板类。

那么如何完成?

您可以通过将所有定义(当前在StructStack.cpp中)放入StructStack.h中解决此问题,然后删除前者。编译器需要访问实现代码,以便可以根据需要实例化类模板。

您只需要将功能的定义放在标题文件中即可。您在StructStack.cpp中写的所有内容都应在类别定义后的StructStack.h中进行。

需要使用它的每个文件都需要看到模板代码。

在专门或使用之前,它不会被编译。

基本上,如果要在不同的文件中使用它,则必须将其放入标题文件中,然后包含它。当您实际使用具有特定类型的模板时,将在上下文中生成代码。

c 模板代码应始终放入标题文件中,以便在每个翻译单元中可见实现,您希望在其中实例化模板。如果您愿意,可以将代码分离为 *.h and *.cpp文件,但是您仍然应该在 *.h文件末尾的#include *.cpp文件。