从自定义sqrt函数捕获异常在c++中失败
Catching exception from custom sqrt function fails in C++
我试图演示异常处理,遇到了一个我无法解决的奇怪问题。问题出现在以下代码中:
#include <iostream>
#include <cmath>
#include <stdexcept>
using namespace std;
double sqrt(double x) {
if ( x < 0 ){
throw invalid_argument("sqrt received negative argument");
}
return sqrt(x);
}
int main(int argc, char *argv[]) {
try {
double s = sqrt(-1);
}
catch (const exception& e) {
cout << "Caught " << e.what() << endl;
}
return 0;
}
代码失败:
terminate called after throwing an instance of 'std::invalid_argument'
what(): sqrt received negative argument
./dostuff.sh: line 8: 3472 Aborted (core dumped) ./may_22.exe
如果,然而,我要么改变我写的sqrt函数的名字为"mySqrt",或者删除头,异常被正确捕获。知道是什么原因造成的吗?
我通过
编译 g++ -g -Wall -std=c++0x -Weffc++ may_22.cpp -o may_22.exe
与g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
EDIT:澄清一下,这似乎不是名称空间问题。代码显然在调用我的sqrt函数,如异常消息所示。
编辑2:这段代码仍然无法为我处理异常。
#include <iostream>
#include <cmath>
#include <stdexcept>
double sqrt(double x) {
if ( x < 0 ){
throw std::invalid_argument("sqrt received negative argument");
}
return std::sqrt(x);
}
int main(int argc, char *argv[]) {
try {
double s = sqrt(-1);
}
catch (std::exception& e) {
std::cout << "Caught " << e.what() << std::endl;
}
return 0;
}
您不能调用函数sqrt
,因为它是保留的。你的函数正在被调用,但你的实现还包括一个头文件,说sqrt
不能抛出。把函数名改成别的,问题就解决了。
如果您将函数更改为double sqrt(double const& x) {
,也可以看到问题。您可能会得到关于冲突的重载的错误。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- variadic模板中的模板参数推导失败