错误:'{'令牌之前的预期类名 - 似乎无法找到任何循环包含

时间:2016-09-29 21:27:35

标签: c++ c++11 makefile

据我所知,这个问题已被问过几次,通常的情况是因为循环包含,但我在过去的几个小时里遇到了麻烦,试图找出我可能有一个循环包含的情况。我认为我无法向前宣布任何事情。我可能错了,所以我需要一些帮助

我试图完成的任务使用两个ADT,一个是Stack,另一个是Queue。这些文件模板化以接受任何数据类型,但在本实验中,我们将使用字符串。我们的Queue.h / .hpp应该实现QueueInterface.h,而Stack.h / .hpp应该实现StackInterface.h

最后,我们必须定义我们自己的错误,名为PreconditionViolationException.h是std :: runtime_error的子类。

Maybe this link will help if that's not a good explanation

为了节省一些时间,我将从我正在使用的文件列表开始,然后是我的Makefile。

Executive.h / .cpp,main.cpp,Node.h / .hpp PreconditionViolationException.h / .cpp Queue.h / .hpp QueueInterface.h Stack.h / .hpp StackInterface.h

BuildingExecutive: main.o Executive.o PreconditionViolationException.o
    g++ -std=c++11 -g -Wall main.o PreconditionViolationException.o Executive.o -o BuildingExecutive

main.o: main.cpp
    g++ -std=c++11 -g -Wall -c main.cpp

PreconditionViolationException.o: PreconditionViolationException.cpp PreconditionViolationException.h
    g++ -std=c++11 -g -Wall -c PreconditionViolationException.cpp

Executive.o: Executive.cpp Executive.h Queue.hpp Queue.h Stack.hpp Stack.h Node.hpp Node.h StackInterface.h QueueInterface.h
    g++ -std=c++11 -g -Wall -c Executive.cpp

这是我对Makefile有一个可能偏离主题的问题。我的问题是我是否应该编译PreconditionViolationException.o作为它自己的目标文件?我可以看到为什么我没有显式编译我的Stack和Queue文件,因为它们是模板化的,但由于依赖于PreconditionViolationException的唯一文件是模板化文件,这是否有所不同?我的Executive(只是输出和运行程序的文件)不依赖于PreconditionViolationException,它只捕获任何std :: exception,它应该捕获PreconditionViolationException,因为std :: runtime_error是std :: exception的子类

如果我的Makefile没有明显的问题,这里基本上是我试图追踪是否有任何循环包含。

我从我的main.cpp开始,看起来像这样。

#include "Executive.h"

int main(int argc, char** argv) {
  Executive exec(argv[1]);
  exec.Run();
  return 0;
}

这只包括Executive.h,所以这就是

#ifndef EXECUTIVE_H
#define EXECUTIVE_H

#include "Queue.h"
#include "Stack.h"

class Executive {
.
. will cutout whatever isn't necessary
.
private:
    Queue<std::string> Line;
    Stack<std::string> Elevator;
};
#endif

这个文件依赖于Queue.h和Stack.h,所以这里是那些

#ifndef QUEUE_H
#define QUEUE_H

#include "Node.h"
#include "QueueInterface.h"

template <typename T>
class Queue : public QueueInterface {
.
.
.
};
#endif

然后

#ifndef STACK_H
#define STACK_H

#include "Node.h"
#include "StackInterface.h"

template <typename T>
class Stack : public StackInterface {
.
.
.
};

我认为Node不会导致问题,所以这里是接口

#ifndef STACKINTERFACE_H
#define STACKINTERFACE_H

#include "PreconditionViolationException.h"

template <typename T>
class StackInterface {
.
.
.
};
#endif

#ifndef QUEUEINTERFACE_H
#define QUEUEINTERFACE_H

#include "PreconditionViolationException.h"

template <typename T>
class QueueInterface {
.
.
.
}
#endif

其中每个都包含PreconditionViolationException,因为它们的方法可以抛出该异常。

#ifndef PVE_H
#define PVE_H

#include <stdexcept>
#include <string>

class PreconditionViolationException : public std::runtime_error {
.
.
.
}
#endif

如果我错了,请纠正我,但在阅读this之后,我认为除了宣布我的节点之外我还有其他任何地方可以向前宣布任何事情。由于我对所有内容如何编译在一起的理解不是最好的,我能想到的唯一事情是我的makefile不适合这个任务,或者我有循环包括我无法识别。

我花了很多时间试图追踪并了解正在发生的事情,所以我希望有一些东西可以帮助我更好地理解正在发生的事情。

对不起,如果这真的很长!任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

<div id="{$TIMEDISPLAY}">
    <!-- some content here -->
</div>

template<class T> class Stack : public StackInterface { 不是一个班级(它是一个班级模板),所以你不能从中继承。

您可能想继承StackInterface,同样也要继承StackInterface<T>