0

可能重复:
为什么模板只能在头文件中实现?
为什么模板类的实现和声明应该在同一个头文件中?

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

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

结构堆栈.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

结构堆栈.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
}

如果我尝试编译这两个文件,我会收到一堆编译错误。我在网上读到,在多文件项目中创建模板类有点困难。

那么如何做到这一点呢?

4

4 回答 4

2

您只需要将函数的定义放在头文件中。你在里面写的所有东西都StructStack.cpp应该放在StructStack.h类定义之后。

于 2012-11-07T11:48:49.257 回答
2

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

于 2012-11-07T11:49:05.823 回答
1

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

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

基本上如果你想在不同的文件中使用它,你必须把它放在头文件中,然后包含它。当您实际使用具有某种类型的模板时,代码将在使用它的上下文中生成。

于 2012-11-07T11:50:01.057 回答
0

C++ 模板代码应始终放在头文件中,以便在您希望实例化模板的每个翻译单元中都可以看到实现。如果您愿意,可以将代码分隔为 *.h 和 *.cpp 文件,但您仍应在 *.h 文件的末尾 #include *.cpp 文件。

于 2012-11-07T11:53:12.183 回答