c++ - 声明中的异常规范与先前的声明不匹配
问题描述
我用 g++ 和 clang++ 编译了文件。
g++ 没有任何错误和警告。
但是 clang++ 有一个错误“声明中的异常规范与先前的声明不匹配”。
顺便说一句,如果文件没有throw()
,则 clang++ 输出中没有任何错误和警告。
哪个对 c++ 规范、gcc 或 clang 是正确的?
版本:
g++:7.4.0
clang++:10.0.0
struct A {
void g() throw () { }
static void (A::*pmf)() throw ();
};
void (A::* A::pmf)() = &A::g;
解决方案
当我编写一个 cpp 程序来实现带有异常处理的堆栈时,我遇到了同样的问题。我正在使用模板创建一个类:
template <class T>
class Stack{
private:
T *stk;
T size;
int top;
public:
Stack(){
top = -1;
size = 1;
}
void push(T data); // definition
void create(T size);
void pop();
};
template <class T>
void Stack<T>::push(int data){//error line due to differ datatypes in declaration and definition
try{
if(top == --size)
throw StackOverflow();
top++;
stk[top] = data;
cout<<"\nData is inserted : "<<stk[top];
}
catch(StackOverflow){
cout<<"\nStack overflowed";
}
}
我遇到了同样的错误,因为我已经在课堂上声明了这一点:
void push(T data);
这在函数的定义中:
void Stack<T>::push(int data)
我在类内声明然后在类外定义的函数签名肯定是不同的。这就是发生该错误的原因。
所以我相应地匹配了他们两个:
void push(T data);
void Stack<T>::push(T data)
这解决了我的错误并且程序编译成功。
推荐阅读
- c# - 如果有人将字符串输入双精度并且在发送错误消息后,他们如何再次发送错误
- java - 为什么不能用 sysem.out.print 命令打印 2 个字符
- angular - Angular Azure AD - MsalModule。认证后获取Access Token
- javascript - Momentjs如何获取时区时间 - 不基于计算机日期时间
- html - 需要帮助了解 IE 中加载的 HTML 页面中的图像如何存储/访问(Excel VBA)
- javascript - 如何使用 Javascript 基于另一个 div 设置 div 的样式?
- image-processing - Julia:无法从 JuliaPro 1.1.1.1 编译 ImageView.jl(尽管它在 Julia 1.1 中运行没有问题)
- r - 如何在我的 PSV 文件中添加适当的间距?
- c# - 将具有特定字符串格式的日期时间添加到 SQLite 数据库
- java - 验证构造函数输入的最佳位置