【发布时间】:2011-01-28 09:04:41
【问题描述】:
这是<stdexcept>中定义的异常:
class length_error : public logic_error
{
public:
explicit length_error(const string& __arg);
};
这是我的例外:
#include <string>
#include <stdexcept>
using namespace std;
class rpn_expression_error : public logic_error
{
public:
explicit rpn_expression_error(const string& __arg);
};
为什么<stdexcept> 没有出现此错误?
Undefined symbols:
rpn_expression_error::rpn_expression_error(/*string*/ const&), referenced from:
...
ld: symbol(s) not found
应@sbi 的要求,这里是我目前代码的一个最小示例:
#include <string>
#include <iostream>
#include <stdexcept>
using namespace std;
class RPN_Calculator {
public:
class rpn_expression_error : public logic_error {
public:
explicit rpn_expression_error(const string& arg) : logic_error(arg) {}
};
void Execute() {
throw rpn_expression_error("Hello");
}
};
int main() {
RPN_Calculator calc;
try {
calc.Execute();
} catch (exception e) {
cout << e.what() << endl;
}
}
我将其保存为 rpn.cpp 并运行 make rpn以产生错误。
代码现在完全构建,但是,真正的程序仍然给我原来的错误。
注意/解决方案:虽然上面的代码运行得很好,但实际代码中的相同异常类仍然会产生链接器错误。为简化起见,我只是将 rpn_expression_error 提升为它自己的全局范围类,这似乎解决了问题。
【问题讨论】:
-
愚蠢的问题,你是否真的在源文件中定义了
rpn_expression_error构造函数?您确定将定义限定为rpn_expression_error::rpn_expression_error吗?相应的目标文件是否链接到您的可执行文件中?如果其中一项或多项不正确,就会出现这种错误。
标签: c++ debugging inheritance exception