C ++模板:<class>没有命名类型

时间:2018-03-30 23:56:12

标签: c++ templates

新手到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

我知道我错过了什么,但不明白什么。谢谢!

1 个答案:

答案 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