簡體   English   中英

“Expected '(' for function-style cast or type construction”錯誤是什么意思?

[英]What does the "Expected '(' for function-style cast or type construction" error mean?

我收到錯誤“Expected '(' for function-style cast or type construction”,並已盡我所能在線研究此錯誤的含義,但無法找到任何導致此錯誤的文檔。

我發現的有關 Stack Overflow 的所有相關問題都修復了特定的代碼片段,並且沒有更一般地解釋導致錯誤的原因。

這些包括

  1. 函數樣式轉換或類型構造答案的預期 '('突出顯示了代碼的幾個問題。哪個問題實際上導致了錯誤尚不清楚。
  2. c++ Xcode 預期的 '(' 用於函數式強制轉換或類型構造在主函數內定義函數。這似乎是一個明顯的語法問題,但為什么會產生這個特定錯誤對我來說仍然不清楚。
  3. '(' 用於函數樣式轉換或構造類型 Xcode 錯誤。在最后一個示例中,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 ,我被引導相信這種語法是可能的

這是一個語法錯誤 現在,非程序員或業余愛好者可能會聽到術語語法錯誤並將其等同於一般錯誤。 但在 C++(和其他語言)中,它具有更具體的含義。

有一種語言語法是一組規則,編譯器在翻譯的早期階段根據這些規則將源代碼分解為邏輯組。 這是在賦予這些組任何含義之前(該部分有時稱為語義檢查)。

您看到的語法錯誤意味着編譯器無法將源代碼與 C++ 的語法規則相匹配。 正是因為它無法做到這一點——編譯器很難知道程序員的意圖。 因此,語法錯誤消息通常是猜測或與程序員的意圖無關。

當您看到此錯誤時,編譯器會建議一種更改可能與其中一個語法規則匹配的代碼的方法,但這在這種情況下實際上可能是也可能不是一個好的修復方法。

因此,您可以將此類錯誤視為“一般語法錯誤”,而不必過多擔心錯誤的細節。 要修復它,請回到您確定不是語法錯誤的更簡單的表達式,然后構建您想要編寫的內容。

英語的一個類比可能是句子“我房間去了”。 想象一些語言翻譯軟件。 這與任何已知的句子結構都不匹配,但它可以報告什么錯誤消息? 實際的建議可能無法幫助您修正句子。


在您的具體示例中,存在語法錯誤。 g++ 錯誤信息不同:

錯誤:“。”之前的預期主表達式令牌

其中primary-expression是 C++ 語法中的一個條目。 g++ 看到. 令牌並假設您的意思是成員訪問運算符。 但是語法說成員訪問運算符的左側操作數必須是主表達式(語義規則說這個主表達式表示您要訪問其成員的對象)。

但是,在您的實際代碼中,左側是(double) boost::integer_traits<unsigned short> ,它與primary-expression的語法規范不匹配。 (實際上它是一個類型名稱)。 編譯器無法從這里繼續進行,所以它退出了。

您的編譯器也未能將代碼與任何語法規則匹配,但它猜測您正在嘗試編寫函數式強制轉換或類型構造。

“函數式強制轉換”表示類似int(5.0)的代碼,因此它可能將boost::integer_traits<unsigned short>識別為類型名稱,並且它猜測您的意思是boost::integer_traits<unsigned short>(const_max) ,即將一些變量const_max轉換為該類型。

我不確定您的編譯器在這里所​​說的“類型構造”是什么意思。

注意。 如果您想知道如何修復問題中的實際代碼,我建議您開始一個新問題,在其中發布代碼和錯誤消息並詢問如何修復代碼。

我通過在我的 Makefile 中添加-std=c++20來修復此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM