我正在尝试获取我创建的列表数据类型并将其作为模板。这样做我遇到了以下模糊的问题。如果需要,我可以发布所有代码,但这实际上是引起问题的函数。
注意:在我使用此方法之前,此代码编译得很好。我写完每一行作为一个完整性检查后编译,一切都很好,但后来我到了这一点,它爆炸了。如果我从这个方法中取出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; }
}
我也可以捕获(int)并且它会编译得很好,但如果我尝试捕获(std :: bad_alloc)(即没有“异常”变量名),它会抛出上面列出的相同错误。即使我尝试简单地捕获(std :: exception)也无法编译。
所以现在我很难过。我不是任何一个C ++专家,这是一个类,我不知道如何克服这个错误。
顺便提一下,这里是来自非通用版本的代码,它也编译得很好,并且从我正在使用的教科书中逐字逐句(戴尔,如果有人想知道的话):
bool UnsortedListType::IsFull() const
{
NodeType* location;
try
{
location = new NodeType;
delete location;
return false;
}
catch (std::bad_alloc exception)
{
return true;
}
}
我在Windows 7上使用内置GNU编译器的CodeBlocks 12.11 IDE。
任何帮助表示感谢,如果有要求,我会很乐意发布更多代码,我只是不想填写页面。
非常感谢提前。
PS我应该说,是的我正在做作业,但是家庭作业并没有要求我制作模板,我选择自己去那条路。不确定它是否有任何相关性,但这是我第一次使用C ++模板,所以只是把它扔到那里。
答案 0 :(得分:3)
std::bad_alloc
在标头<new>
中定义,因此您需要包含该内容。
此外,最好通过引用捕获异常。按值捕获会导致异常对象的副本(可能是切片)。我个人认为非const引用是一种习惯,允许在处理过程中添加异常状态,但大多数基本异常类型都是无状态的,因此const &
和非const &
之间没有实际区别。