在模板中捕获异常类

时间:2011-04-07 19:19:30

标签: c++ templates exception exception-handling overflow

我正在使用异常类Overflow()来创建我正在创建的Stack模板。如果我定期定义课程没有问题。如果我将类定义为模板,我无法调用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(Stack :: Overflow)语句中。正如我所说的,如果课程不是模板,那就可以了。但是,一旦我将其定义为模板,这就不再起作用了。我已经尝试了各种语法,但我总是从编译器中得到两组错误消息之一。

如果我使用catch(Stack :: Overflow):

ch18pr01.cpp(89) : error C2955: 'Stack' : use of class template requires template argument list
ch18pr01.cpp(13) : see declaration of 'Stack'
ch18pr01.cpp(89) : error C2955: 'Stack' : use of class template requires template argument list
ch18pr01.cpp(13) : see declaration of 'Stack'
ch18pr01.cpp(89) : error C2316: 'Stack<T>::Overflow' : cannot be caught as the destructor and/or copy constructor are inaccessible
编辑:我的意思是 如果我使用catch(Stack&lt; double&gt; :: Overflow)或其任何变种:

ch18pr01.cpp(89) : error C2061: syntax error : identifier 'Stack'
ch18pr01.cpp(89) : error C2310: catch handlers must specify one type
ch18pr01.cpp(95) : error C2317: 'try' block starting on line '75' has no catch handlers

我简直无法弄清楚这一点。有没有人有任何想法?

3 个答案:

答案 0 :(得分:2)

catch (const Stack<double>::Overflow & obj)
                 //^^^^^^^^ note this!

也就是说,你也要提供这种类型。

另请注意,我接受该对象为const引用,以避免复制原始Overflow对象!

顺便问一下,为什么要让Overflow成为嵌套类型?你有什么理由?我没有看到任何令人信服的理由这样做。如果在Stack类模板之外定义它会更好。

答案 1 :(得分:2)

关键是你应该把

class overflow;

外面

class Stack<>

因为它是一般例外,不是指定的类型。

答案 2 :(得分:1)

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

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";
}

如果你没有指定模板参数,编译器会感到困惑,因为它不知道要使用哪个类(例如Stack<int>Stack<double>?)。

附注:尽量避免对类型和变量使用相同的名称(本例中为StackStack),这会使可读性和错误跟踪更加困难。