1

我正在尝试采用我创建的列表数据类型并将其作为模板。在这样做时,我遇到了以下晦涩的问题。如果需要,我可以发布所有代码,但这确实是导致问题的函数。

注意:在我使用这个方法之前,这段代码编译得很好。我在每写几行作为健全性检查后进行编译,一切都很好,但后来我到了这一点,它爆炸了。如果我从这个方法中取出 try/catch 块,它编译得很好,所以我很确定问题在那里被隔离,而不是标题/等中缺少分号。正如其他答案所报道的那样——尽管我当然做了三次检查以确保!:)

这是导致问题的代码:

template<class T>
bool UnsortedListType<T>::IsFull()
{
    try { return false; }
    catch(std::bad_alloc exception) { return true; }  // line 35
}

就像我说的,我尽可能地简化了它,同时仍然触发了错误。这是错误:

UnsortedListType.cpp||In member function 'bool UnsortedListType<T>::IsFull()':
UnsortedListType.cpp|35|error: expected type-specifier
UnsortedListType.cpp|35|error: expected unqualified-id before 'exception'
UnsortedListType.cpp|35|error: expected ')' before 'exception'
UnsortedListType.cpp|35|error: expected '{' before 'exception'
UnsortedListType.cpp|35|error: 'exception' was not declared in this scope
UnsortedListType.cpp|35|error: expected ';' before ')' token

我能找到的关于这个错误的所有内容都表明问题要么是额外的分号,要么是缺少分号,无论是在标题中还是在这个文件中。我找不到任何一个实例。如果我删除 try/catch 块,它编译得很好。

另外,如果我捕捉到一个 int,它编译得很好:

template<class T>
bool UnsortedListType<T>::IsFull()
{
    try { return false; }
    catch(int exception) { return true; }
}

我也可以 catch(int) 并且它会编译得很好,但是如果我尝试 catch(std::bad_alloc) (即没有“异常”变量名)它会抛出上面列出的相同错误。即使我尝试简单地 catch(std::exception) 它也无法编译。

所以现在我很难过。无论如何,我都不是 C++ 专家,这是针对一门课的,我不知道如何克服这个错误。

顺便说一句,这是非通用版本的代码,它也可以很好地编译,并且逐字逐句地来自我正在使用的教科书(戴尔,如果有人想知道的话):

bool UnsortedListType::IsFull() const
{
    NodeType* location;
    try
    {
        location = new NodeType;
        delete location;
        return false;
    }
    catch (std::bad_alloc exception)
    {
        return true;
    }
}

我在带有内置 GNU 编译器的 Windows 7 上使用 CodeBlocks 12.11 IDE。

任何帮助表示赞赏,如果需要,我很乐意发布更多代码,我只是不想填满页面。

提前谢谢了。

PS我应该说,是的,我正在做作业,但是作业并没有要求我制作模板,我选择自己走那条路。不确定它是否有任何相关性,但这是我第一次使用 C++ 模板,所以把它扔在那里。

4

1 回答 1

3

std::bad_alloc在 header 中定义<new>,因此您需要包含它。

此外,最好通过引用来捕获异常。按值捕获会导致生成异常对象的副本(可能是切片)。const &我个人让 non-const 引用成为一种习惯,允许在处理过程中添加异常状态,但大多数基本异常类型都是无状态的,因此和 non-const之间没有实际区别&

于 2013-07-09T02:08:37.197 回答