1. ホーム
  2. c++

[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?

2022-01-23 15:53:19

質問

エラー "Expected '(' for function-style cast or type construction" が発生し、このエラーの意味をネットで調べてみましたが、このエラーの原因に関する文書が見当たりません。

Stack Overflow で見つけた関連する質問はすべて、特定のコードスニペットを修正するもので、より一般的なエラーの原因については説明されていません。

以下のようなものがあります。

  1. 関数型キャストまたは型構築のために期待される '(') は、コードのいくつかの問題点を浮き彫りにしています。どの問題が実際にエラーを引き起こしているかは不明です。
  2. c++ Xcode は、関数スタイルのキャストまたは型構築のために '(') を予期していました。 は、main 関数の内部で関数を定義しています。これは明らかな構文上の問題のように思えますが、なぜこの特定のエラーが発生するのかは、私にはまだ不明です。
  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++の文法規則を照合できなかったことを意味します。 コンパイラはプログラマが何を意図しているかを知ることは難しいのです。そのため、シンタックスエラーのメッセージは推測であったり、プログラマーの意図とは関係ないことが多いのです。

このエラーが表示されたとき、コンパイラは、おそらく文法規則の1つにマッチするようなコードの変更方法を提案していますが、それが実際に状況に応じて良い修正になるかどうかはわかりません。

ですから、この種のエラーは、エラーの詳細をあまり気にせず、単に"一般的な構文エラー"として扱えばいいのです。修正するには、構文エラーでないことが確実な、より単純な表現に戻り、書きたかったことに向かって積み上げていけばいいのです。

英語で例えると、quot;I the room went of"という文章になるかもしれません。 ある言語翻訳ソフトを想像してください。これは既知の文型と一致しませんが、どのようなエラーメッセージを報告できるでしょうか。 実際の提案では、おそらくこの文章を修正する助けにはならないでしょう。


あなたの具体的な例では、シンタックスエラーがあります。g++のエラーメッセージは異なります。

error: '.'トークンの前に一次式があることが期待されます。

ここで 一次式 はC++文法のエントリです。 . トークンのことで、メンバアクセス演算子のことだと思われます。 しかし文法では、メンバーアクセス演算子の左側のオペランドは 一次式 (意味上の規則では、この一次式はアクセスしたいメンバーを持つオブジェクトを表すとされています)。

しかし、あなたの実際のコードでは、左側が (double) boost::integer_traits<unsigned short> の文法仕様と一致しません。 一次式 . (実際は型名です)。コンパイラはここから先には進めないので、そのまま終了します。

コンパイラはコードをどの文法規則にも一致させることができませんでしたが、あなたが関数型のキャストまたは型構築を書こうとしているのだと推測されます。

関数型キャストとは、以下のようなコードです。 int(5.0) ということで、おそらく boost::integer_traits<unsigned short> を型名とし、それを boost::integer_traits<unsigned short>(const_max) つまり、ある変数をキャストして const_max をその型に変換します。

コンパイラがここで言う "型構築" が何を意味するのかよくわかりません。

NB. もし、あなたの質問にある実際のコードを修正する方法を知りたいのであれば、コードとエラーメッセージを投稿し、そのコードを修正する方法を尋ねる新しい質問を始めることをお勧めします。