新手到C ++所以请原谅我。我试图编写一个简单的模板类来实现Stack数据结构功能。我已阅读此问题,以了解模板声明和实施的工作原理:Why can templates only be implemented in the header file?。但是我想使用类声明和实现是分开的解决方案(没有在.h中内联定义)。
MyStack.h:
#include "StackNode.h"
#include "MyStack.tpp"
template <typename T>
class MyStack
{
private:
StackNode<T> *top;
public:
MyStack();
virtual ~MyStack();
};
MyStack.tpp:
#include "MyStack.h"
template <typename T>
MyStack<T>::MyStack()
: top(nullptr)
{
}
template <typename T>
MyStack<T>::~MyStack()
{
}
main.cpp中:
#include "MyStack.h"
int main() {
MyStack<int> myStack;
return 0;
}
然而,编译上述内容会出现此错误:
../src/MyStack.tpp:11:1: error: 'MyStack' does not name a type
../src/MyStack.tpp:18:1: error: 'MyStack' does not name a type
我知道我错过了什么,但不明白什么。谢谢!
答案 0 :(得分:1)
问题在于,在实际声明类之前,您要包含.tpp
文件,其中包含类方法定义。您需要将#include
语句移到类声明下面。
此外,.tpp
文件不应该是#include
最初.h
的{{1}}文件。事实上,这将无法正常工作,因为您的#include
文件缺少标题保护,以防止同一翻译单元中的多个包含(即,在这种情况下为.h
)。因此,您最终会得到main.cpp
,其中包含MyStack.h
,其中再次包含MyStack.tpp
,这会在尝试重新声明已声明的内容时导致错误。始终在MyStack.h
文件中声明标题保护。
请改为尝试:
MyStack.h:
.h
MyStack.tpp:
#ifndef MyStack_H
#define MyStack_H
#include "StackNode.h"
template <typename T>
class MyStack
{
private:
StackNode<T> *top;
public:
MyStack();
virtual ~MyStack();
};
#include "MyStack.tpp"
#endif