【问题标题】:Unusual Error: expected unqualified-id before ')' token异常错误:')' 标记之前的预期 unqualified-id
【发布时间】:2013-07-06 11:22:13
【问题描述】:

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

注意:在我使用这个方法之前,这段代码编译得很好。我在每隔几行编写一次作为完整性检查后进行编译,一切都很好,但后来我到了这一点,它爆炸了。如果我从这个方法中取出 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++ 专家,这是针对一门课的,我不知道如何克服这个错误。

顺便说一下,这是非通用版本的代码,它编译得也很好,而且是我正在使用的教科书的逐字记录(Dale,如果有人想知道的话):

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++ 模板,所以把它扔在那里。

【问题讨论】:

  • 通过引用捕获异常。
  • 你需要#include&lt;exception&gt;
  • 其实我相信你需要#include &lt;new&gt;。是的,建议您通过 const-reference 捕获异常:catch (const std::bad_alloc &amp;exception)
  • 有趣... #include 已修复,谢谢!但是为什么行 catch(std::bad_alloc exception) 编译得很好,从文本中逐字提取,但我的版本没有?为什么它在我之前没有 #include 但现在不起作用的代码中按原样工作?那是真正让我难过的地方,它起作用了,然后突然不起作用,我找不到导致它的原因。 :(
  • @Dave 抱歉,我现在才看到更新。是的,&lt;new&gt; 包含在其他几个标头中,特别是 &lt;stdexcept&gt;,它又被标准库的许多部分包含。

标签: c++


【解决方案1】:

std::bad_alloc 定义在标题 &lt;new&gt; 中,因此您需要包含它。

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

【讨论】:

  • “切片副本”是什么意思?
  • @Dave 如果从派生类的实例初始化基类的对象(例如std::exception),则复制构造函数用于原始的基子对象。这可能会使基类实现感到惊讶,并且无论如何它都会丢失信息。这种效果称为“切片”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多