【问题标题】:What does the "Expected '(' for function-style cast or type construction" error mean?“Expected '(' for function-style cast or type construction”错误是什么意思?
【发布时间】:2016-10-15 19:43:47
【问题描述】:

我收到错误“Expected '(' for function-style cast or type construction”,并已尽我所能在线研究此错误的含义,但无法找到任何文档说明导致此错误的原因错误。

我发现的有关 Stack Overflow 的所有相关问题都修复了特定代码 sn-p 并且没有更一般地解释导致错误的原因。

这些包括

  1. Expected '(' for function-style cast or type construction 回答突出了代码的几个问题。究竟是哪个问题导致了错误尚不清楚。
  2. c++ Xcode expected '(' for function-style cast or type construction 在主函数中定义函数。这似乎是一个明显的语法问题,但我仍然不清楚为什么会产生这个特定错误。
  3. '(' for function-style cast or construction type Xcode error。在最后一个示例中,OP 调用函数的方式看起来与函数声明非常相似,而且它们声明了一个名称相同但签名不同的函数。根据引发错误的位置和错误消息,错误似乎与函数声明有关。

我能否得到一个文档风格的答案,用简单的英语翻译“函数风格转换”和“类型构造”的含义?编译器何时选择抛出此错误而不是其他错误?

我不想要特定于我自己的错误的答案,但根据要求,这是我的 MCVE

#include <boost/integer_traits.hpp>

class Test{
    const double MAX_DEPTH_VAL = (double) boost::integer_traits<unsigned short>.const_max;
    const double MIN_DEPTH_VAL = (double) boost::integer_traits<unsigned short>.const_max;

};

这个答案让我相信这种语法是可能的,https://stackoverflow.com/a/2738576/3303546

【问题讨论】:

  • 我该如何改进这个问题?
  • 显示代码。只是产生错误信息的代码...
  • 该错误表明编译器认为您正在编写函数样式转换,即类似于T(x),其中T 是一个类型,x 是一个对象。但是,它没有找到左括号。代码很可能使用您认为类型是值的类型。顺便说一句,这不是异常,而是编译时错误。
  • 我们需要更多代码。
  • . 运算符不能应用于类型。您将它应用于对象。响应的重点是值不是函数而是值。您可以使用 :: 运算符引用它们。

标签: c++


【解决方案1】:

这是一个语法错误。现在,非程序员或业余爱好者可能会听到 语法错误 一词并将其等同于一般错误。但在 C++(和其他语言)中,它具有更具体的含义。

有一个language grammar 是一组规则,编译器在翻译的早期阶段根据这些规则将源代码分解为逻辑组。这是在赋予这些组任何含义之前(该部分有时称为语义检查)。

您看到的语法错误意味着编译器无法将源代码与 C++ 的语法规则相匹配。正是因为它无法做到这一点——编译器很难知道程序员的意图。因此,语法错误消息通常是猜测或与程序员的意图无关。

当您看到此错误时,编译器会建议一种更改代码的方法,该方法可能与某个语法规则匹配,但在这种情况下这实际上可能是也可能不是一个好的修复方法。

因此,您可以将此类错误视为“一般语法错误”,而不必过多担心错误的细节。要修复它,请返回到您确定不是语法错误的更简单的表达式,然后逐步构建您想要编写的内容。

英语的一个类比可能是句子“I the room went of”。想象一些语言翻译软件。这与任何已知的句子结构都不匹配,但它可以报告什么错误消息?实际的建议可能无法帮助您修正句子。


在您的具体示例中,存在语法错误。 g++报错信息不同:

错误:'.' 之前的预期主表达式令牌

其中 primary-expression 是 C++ 语法中的一个条目。 g++ 看到 . 标记并假设您的意思是成员访问运算符。但是语法说成员访问运算符的左侧操作数必须是primary-expression(语义规则说这个primary-expression表示您要访问其成员的对象)。

但是在您的实际代码中,左侧是(double) boost::integer_traits&lt;unsigned short&gt;,它与primary-expression 的语法规范不匹配。 (实际上它是一个类型名称)。编译器无法从这里继续进行,所以它退出了。

您的编译器也未能将代码与任何语法规则相匹配,但它猜测您正在尝试编写函数式强制转换或类型构造。

“Function-style cast”表示像int(5.0) 这样的代码,所以它可能将boost::integer_traits&lt;unsigned short&gt; 识别为类型名称,并且它猜测您的意思是boost::integer_traits&lt;unsigned short&gt;(const_max),即将某个变量const_max 转换为该类型。

我不确定你的编译器在这里所​​说的“类型构造”是什么意思。

注意。如果您想知道如何修复问题中的实际代码,我建议您开始一个新问题,在其中发布代码和错误消息并询问如何修复代码。

【讨论】:

  • 大概“类型构造”指的是T()T(x, y, z)
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2020-04-29
  • 2017-02-27
  • 2015-08-20
相关资源
最近更新 更多