我正在尝试使用链接列表实现优先级队列,但我遇到了try / catch问题。以下是优先级队列头文件的相关部分:
#ifndef PRIORITYQUEUELINKED_H
#define PRIORITYQUEUELINKED_H
#include "RuntimeException.h"
#include <list>
using namespace std;
template <typename E, typename C> // uses data type and some total order relation
class PriorityQueueLinked {
// code for PriorityQueueLinked
class EmptyPriorityQueueException : public RuntimeException {
public:
EmptyPriorityQueueException() :
RuntimeException("Empty priority queue") {}
};
// more code
#endif
这是RuntimeException头文件:
#ifndef RUNTIMEEXCEPTION_H_
#define RUNTIMEEXCEPTION_H_
#include <string>
class RuntimeException {// generic run-time exception
private:
std::string errorMsg;
public:
RuntimeException(const std::string& err) { errorMsg = err; }
std::string getMessage() const { return errorMsg; }
};
inline std::ostream& operator<<(std::ostream& out, const RuntimeException& e)
{
out << e.getMessage();
return out;
}
#endif
这是我的主要内容:
#include "PriorityQueueLinked.h"
#include "Comparator.h"
#include <iostream>
using namespace std;
int main() {
try {
PriorityQueueLinked<int,isLess> prique; // empty priority queue
prique.removeMin(); // throw EmptyPriorityQueueException
}
catch(...) {
cout << "error" << endl << endl;
}
getchar();
return 0;
}
我的问题在于无法为catch获取“...”的替换。我尝试过几个方面,其中之一:“catch(PriorityQueueLinked&lt; int,isLess&gt; :: EmptyPriorityQueueException E)”,但在这种情况下,它表示EmptyPriorityQueueException不是PriorityQueueLinked的成员。任何建议将不胜感激。 感谢
答案 0 :(得分:1)
Try-catch支持使用异常类继承。 catch (const RuntimeException & ex)
将捕获RuntimeException的任何子类,即使它是私有的。这是导出异常类的重点。
顺便说一下,永远不要写using namespace std;
是一个标题,你永远不知道是谁包含它,以及如何。此外,标准库已经拥有了您的真实目的异常类,这真是一个惊喜!他们还会将运行时异常,例外情况写成:std::runtime_exception
。您可以在<stdexcept>
找到它。