Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 捕获模板中的异常类_C++_Templates_Exception_Exception Handling_Overflow - Fatal编程技术网

C++ 捕获模板中的异常类

C++ 捕获模板中的异常类,c++,templates,exception,exception-handling,overflow,C++,Templates,Exception,Exception Handling,Overflow,我在为正在创建的堆栈模板使用异常类Overflow()时遇到问题。如果我定期定义类,就不会有问题。如果将该类定义为模板,则无法使对catch()的调用正常工作。我觉得这只是语法,但我一辈子都搞不懂 #include<iostream> #include<exception> using namespace std; template <class T> class Stack { private: T *stackArray; int siz

我在为正在创建的堆栈模板使用异常类Overflow()时遇到问题。如果我定期定义类,就不会有问题。如果将该类定义为模板,则无法使对catch()的调用正常工作。我觉得这只是语法,但我一辈子都搞不懂

#include<iostream>
#include<exception>
using namespace std;

template <class T>
class Stack
{
private:
    T *stackArray;
    int size;
    int top;

public: 
    Stack(int size) { this->size = size; stackArray = new T[size]; top = 0; }
    ~Stack() { delete[] stackArray; }

    void push(T value)
    {
        if (isFull())
            throw Overflow();
        stackArray[top] = value;
        top++;
    }

    bool isFull()
    {
        if (top == size)
            return true;
        else
            return false;
    }

    class Overflow {};

};

int main()
{
    try
    {
        Stack<double> Stack(5);
        Stack.push( 5.0);
        Stack.push(10.1);
        Stack.push(15.2);
        Stack.push(20.3);
        Stack.push(25.4);
        Stack.push(30.5);
    }
    catch (Stack::Overflow)
    {
        cout << "ERROR! The stack is full.\n";
    }

    return 0;
}
我简直搞不懂。有人知道吗?

catch(const Stack::Overflow&obj)
catch (const Stack<double>::Overflow & obj)
                 //^^^^^^^^ note this!
//^^^^^^^^注意这个!
也就是说,您还必须提供类型

还要注意,我接受对象为
const
引用,以避免复制原始
溢出
对象


顺便问一下,为什么要将
Overflow
设置为嵌套类型?你有什么理由?我看不出有任何令人信服的理由这样做。如果您在
堆栈
类模板之外定义它会更好。

关键是您应该

class overflow;
外面

class Stack<>
类堆栈

因为它是一个常规异常,没有指定类型。

您必须指定您正在使用的模板实例化:

try
{
    Stack<double> Stack(5);
    Stack.push( 5.0);
    Stack.push(10.1);
    Stack.push(15.2);
    Stack.push(20.3);
    Stack.push(25.4);
    Stack.push(30.5);
}
catch (Stack<double>::Overflow)
{
    cout << "ERROR! The stack is full.\n";
}
试试看
{
堆栈(5);
堆栈推送(5.0);
堆栈推送(10.1);
堆栈推送(15.2);
堆栈推送(20.3);
叠加推力(25.4);
叠加推力(30.5);
}
捕获(堆栈::溢出)
{

当然,它应该继承自std::exception。谢谢你的建议。我还是一个初露头角的天才,所以了解正确的编码过程对我来说非常重要。我会这样做。在编辑时:dark_charlie的意思就是:不要对类型和变量使用相同的名称!我使用了catch(Stack::Overflow)以前没有用,但是当我更改变量名时,它就像一个符咒一样工作。为什么编译器不能确定它是哪一个?或者在运行时使用一些RTTI来完成它?我以前尝试过使用Stack::Overflow,但它并没有解决我的问题-直到我将变量名更改为与类名不同的名称.至于我为什么嵌套溢出?这是我的教科书在其示例程序中建议的。@托德:你的类名是
Stack
,你的对象名也是
Stack
。你为什么这样做?你的键盘不允许你输入不同的名称?不需要屈尊…main()是随我的教科书提供的,我打算围绕它构建一个模板类。我不会自己选择这样做。@Todd:你是说你的教科书的类型和变量名称相同?是的。它还告诉我嵌套Overflow()类。
class Stack<>
try
{
    Stack<double> Stack(5);
    Stack.push( 5.0);
    Stack.push(10.1);
    Stack.push(15.2);
    Stack.push(20.3);
    Stack.push(25.4);
    Stack.push(30.5);
}
catch (Stack<double>::Overflow)
{
    cout << "ERROR! The stack is full.\n";
}