首页 > 解决方案 > 声明中的异常规范与先前的声明不匹配

问题描述

我用 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;

标签: c++c++17

解决方案


当我编写一个 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)

这解决了我的错误并且程序编译成功。


推荐阅读